feat: Ports all existing articles and images.
This commit is contained in:
@@ -27,4 +27,11 @@ extension String {
|
|||||||
|
|
||||||
return prefix(length - end.count).split(separator: " ").dropLast().joined(separator: " ") + end
|
return prefix(length - end.count).split(separator: " ").dropLast().joined(separator: " ") + end
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var removeBreaks: String {
|
||||||
|
replacingOccurrences(of: "<br>", with: "")
|
||||||
|
.replacingOccurrences(of: "<br />", with: "")
|
||||||
|
.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
import HTML
|
||||||
import PathKit
|
import PathKit
|
||||||
@preconcurrency import Saga
|
@preconcurrency import Saga
|
||||||
import SagaParsleyMarkdownReader
|
import SagaParsleyMarkdownReader
|
||||||
@@ -45,6 +46,12 @@ func permalink(item: Item<ArticleMetadata>) {
|
|||||||
item.relativeDestination = Path(components: components)
|
item.relativeDestination = Path(components: components)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func removingBreaks<M>(item: Item<M>) {
|
||||||
|
// remove explicit <br /> from items that show up likely due to how prettier formats
|
||||||
|
// markdown files inside of neovim.
|
||||||
|
item.body = item.body.removeBreaks
|
||||||
|
}
|
||||||
|
|
||||||
@main
|
@main
|
||||||
struct Run {
|
struct Run {
|
||||||
static func main() async throws {
|
static func main() async throws {
|
||||||
@@ -56,14 +63,13 @@ struct Run {
|
|||||||
folder: "articles",
|
folder: "articles",
|
||||||
metadata: ArticleMetadata.self,
|
metadata: ArticleMetadata.self,
|
||||||
readers: [.parsleyMarkdownReader],
|
readers: [.parsleyMarkdownReader],
|
||||||
itemProcessor: sequence(publicationDateInFilename, permalink),
|
itemProcessor: sequence(removingBreaks, publicationDateInFilename, permalink),
|
||||||
filter: \.public,
|
filter: \.public,
|
||||||
writers: [
|
writers: [
|
||||||
.itemWriter(swim(renderArticle)),
|
.itemWriter(swim(renderArticle)),
|
||||||
.listWriter(swim(renderArticles)),
|
.listWriter(swim(renderArticles)),
|
||||||
.tagWriter(swim(renderTag), tags: \.metadata.tags),
|
.tagWriter(swim(renderTag), tags: \.metadata.tags),
|
||||||
.yearWriter(swim(renderYear)),
|
.yearWriter(swim(renderYear)),
|
||||||
|
|
||||||
// Atom feed for all articles, and a feed per tag
|
// Atom feed for all articles, and a feed per tag
|
||||||
.listWriter(
|
.listWriter(
|
||||||
atomFeed(
|
atomFeed(
|
||||||
@@ -84,27 +90,12 @@ struct Run {
|
|||||||
)
|
)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
// All markdown files within the "apps" subfolder will be parsed to html,
|
|
||||||
// using AppMetadata as the Item's metadata type.
|
|
||||||
// .register(
|
|
||||||
// folder: "apps",
|
|
||||||
// metadata: AppMetadata.self,
|
|
||||||
// readers: [.parsleyMarkdownReader],
|
|
||||||
// writers: [.listWriter(swim(renderApps))]
|
|
||||||
// )
|
|
||||||
//
|
|
||||||
// .register(
|
|
||||||
// folder: "photos",
|
|
||||||
// readers: [.parsleyMarkdownReader],
|
|
||||||
// writers: [.itemWriter(swim(renderPhotos))]
|
|
||||||
// )
|
|
||||||
|
|
||||||
// All the remaining markdown files will be parsed to html,
|
// All the remaining markdown files will be parsed to html,
|
||||||
// using the default EmptyMetadata as the Item's metadata type.
|
// using the default EmptyMetadata as the Item's metadata type.
|
||||||
.register(
|
.register(
|
||||||
metadata: PageMetadata.self,
|
metadata: PageMetadata.self,
|
||||||
readers: [.parsleyMarkdownReader],
|
readers: [.parsleyMarkdownReader],
|
||||||
|
itemWriteMode: .keepAsFile, // need to keep 404.md as 404.html, not 404/index.html
|
||||||
writers: [.itemWriter(swim(renderPage))]
|
writers: [.itemWriter(swim(renderPage))]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -78,6 +78,9 @@ private func footer(_ rssLink: String) -> Node {
|
|||||||
" | "
|
" | "
|
||||||
a(href: "mailto:michael@mhoush.com", rel: "nofollow") { "Email" }
|
a(href: "mailto:michael@mhoush.com", rel: "nofollow") { "Email" }
|
||||||
}
|
}
|
||||||
|
script(src: "https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js")
|
||||||
|
script(src: "https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js")
|
||||||
|
script(src: "https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ func renderArticleForGrid(article: Item<ArticleMetadata>) -> Node {
|
|||||||
p {
|
p {
|
||||||
a(href: article.url) {
|
a(href: article.url) {
|
||||||
div {
|
div {
|
||||||
img(alt: "banner", src: article.imagePath)
|
// img(alt: "banner", src: article.imagePath)
|
||||||
article.summary
|
article.summary
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -56,7 +56,13 @@ func renderArticles(context: ItemsRenderingContext<ArticleMetadata>) -> Node {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func _renderArticles(_ articles: [Item<ArticleMetadata>], canocicalURL: String, title pageTitle: String, rssLink: String = "", extraHeader: NodeConvertible = Node.fragment([])) -> Node {
|
func _renderArticles(
|
||||||
|
_ articles: [Item<ArticleMetadata>],
|
||||||
|
canocicalURL: String,
|
||||||
|
title pageTitle: String,
|
||||||
|
rssLink: String = "",
|
||||||
|
extraHeader: NodeConvertible = Node.fragment([])
|
||||||
|
) -> Node {
|
||||||
return baseLayout(canocicalURL: canocicalURL, section: .articles, title: pageTitle, rssLink: rssLink, extraHeader: extraHeader) {
|
return baseLayout(canocicalURL: canocicalURL, section: .articles, title: pageTitle, rssLink: rssLink, extraHeader: extraHeader) {
|
||||||
articles.map { article in
|
articles.map { article in
|
||||||
section(class: "mb-10") {
|
section(class: "mb-10") {
|
||||||
@@ -73,9 +79,20 @@ func _renderArticles(_ articles: [Item<ArticleMetadata>], canocicalURL: String,
|
|||||||
}
|
}
|
||||||
|
|
||||||
func renderTag<T>(context: PartitionedRenderingContext<T, ArticleMetadata>) -> Node {
|
func renderTag<T>(context: PartitionedRenderingContext<T, ArticleMetadata>) -> Node {
|
||||||
let extraHeader = link(href: "/articles/tag/\(context.key.slugified)/feed.xml", rel: "alternate", title: "\(SiteMetadata.name): articles with tag \(context.key)", type: "application/rss+xml")
|
let extraHeader = link(
|
||||||
|
href: "/articles/tag/\(context.key.slugified)/feed.xml",
|
||||||
|
rel: "alternate",
|
||||||
|
title: "\(SiteMetadata.name): articles with tag \(context.key)",
|
||||||
|
type: "application/rss+xml"
|
||||||
|
)
|
||||||
|
|
||||||
return _renderArticles(context.items, canocicalURL: "/articles/tag/\(context.key.slugified)/", title: "Articles in \(context.key)", rssLink: "tag/\(context.key.slugified)/", extraHeader: extraHeader)
|
return _renderArticles(
|
||||||
|
context.items,
|
||||||
|
canocicalURL: "/articles/tag/\(context.key.slugified)/",
|
||||||
|
title: "Articles in \(context.key)",
|
||||||
|
rssLink: "tag/\(context.key.slugified)/",
|
||||||
|
extraHeader: extraHeader
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func renderYear<T>(context: PartitionedRenderingContext<T, ArticleMetadata>) -> Node {
|
func renderYear<T>(context: PartitionedRenderingContext<T, ArticleMetadata>) -> Node {
|
||||||
|
|||||||
11
content/404.md
Normal file
11
content/404.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
section: notFound
|
||||||
|
---
|
||||||
|
|
||||||
|
# 404
|
||||||
|
|
||||||
|
## Oops!
|
||||||
|
|
||||||
|
Your page was not found.
|
||||||
|
|
||||||
|
Looking for one of the articles?
|
||||||
101
content/articles/2023-08-10-coil-bypass-overview.md
Normal file
101
content/articles/2023-08-10-coil-bypass-overview.md
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
---
|
||||||
|
tags: HVAC, design
|
||||||
|
---
|
||||||
|
|
||||||
|
# Coil Bypass Overview
|
||||||
|
|
||||||
|
This is the first article in a series that explores the idea of a coil bypass strategy in an HVAC system. This article introduces you to a
|
||||||
|
coil bypass strategy at a high level, future posts will dive deeper into the features, benefits, as well as the challenges of this style of
|
||||||
|
system.
|
||||||
|
|
||||||
|
## What is a Coil Bypass
|
||||||
|
|
||||||
|
A coil bypass is not to be mistaken for a zoning system bypass, where airflow is "relieved" from the supply side of the system back into the
|
||||||
|
return. Instead, a coil bypass diverts a portion of the airflow around the coil using a bypass damper(s). The bypass can serve several
|
||||||
|
functions depending on the application, but in general it allows for a constant volume of air to be delivered to the space while the output
|
||||||
|
of the coil can be shifted towards more or less dehumidification. In other words, it decouples the total system airflow from the coil
|
||||||
|
airflow.
|
||||||
|
|
||||||
|
The bypassed air mixes with the supply air stream to act as a reheat source, however unlike a typical reheat source it does not add more
|
||||||
|
sensible load to the structure, instead it just brings the supply air temperature closer to the existing home's temperature while still
|
||||||
|
covering the latent and sensible loads of the home. A warmer duct system reduces the losses of the duct to unconditioned spaces as well as
|
||||||
|
reduces the risk for duct condensation.
|
||||||
|
|
||||||
|
The coil bypass strategy, as far as I know, was pioneered by [Harry Boody](https://www.linkedin.com/in/harry-boody-9b8a4366/) of Energy
|
||||||
|
Innovations and Scientific Environmental Design, Inc. However their websites are no longer active, so I'm not sure if they are still active
|
||||||
|
in the HVAC design space or not.
|
||||||
|
|
||||||
|
## The Problem
|
||||||
|
|
||||||
|
| Why | |
|
||||||
|
| -------- | ---------------------------------------------------------------- |
|
||||||
|
| Question | Why would we want to utilize a strategy such as the coil bypass? |
|
||||||
|
| Answer | Improved indoor air quality (IAQ) |
|
||||||
|
|
||||||
|
ASHRAE's recommandation for the amount of air changes per hour (ACH) in a residential structure to be in the range of 3-5 ACH, and in
|
||||||
|
general the higher the better, along with a MERV 13+ filter. In some / most cases the system airflow does not meet that criteria, especially
|
||||||
|
low load homes or high volume homes.
|
||||||
|
|
||||||
|
For example, let's imagine a single story ranch home that is 2,500 square feet with 9 foot ceilings. This home is relatively tight
|
||||||
|
construction and after doing the heating and cooling loads we've selected a 2.5 Ton system for this home. It is located in a green grass
|
||||||
|
climate that needs some priority on dehumidification and requires an airflow of 350 CFM/Ton (875 CFM).
|
||||||
|
|
||||||
|
We determine the volume of the conditioned space.
|
||||||
|
|
||||||
|
2,500 x 9 = 22,500 ft^3
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
| **Where:** | |
|
||||||
|
| ---------- | ------------------------------------- |
|
||||||
|
| **V** | _is the volume of the home_ |
|
||||||
|
| **ACH** | _is the desired air changes per hour_ |
|
||||||
|
| **60** | _conversion from hours to minutes_ |
|
||||||
|
|
||||||
|
Below is a table of the required CFM to meet the different air changes per hour.
|
||||||
|
|
||||||
|
| | CFM |
|
||||||
|
| --------------- | :-----------------: |
|
||||||
|
| (22,500 x 3)/60 | **_1,125 @ 3 ACH_** |
|
||||||
|
| (22,500 x 4)/60 | **_1,500 @ 4 ACH_** |
|
||||||
|
| (22,500 x 5)/60 | **_1,875 @ 5 ACH_** |
|
||||||
|
|
||||||
|
As you can see we have a discrepency of meeting even the low end of 3 ACH. The high end of 5 ACH is over 2x the airflow for our 2.5 Ton
|
||||||
|
system. The coil bypass strategy is one viable way, by decoupling the total system airflow from the coil airflow without, which eliminates
|
||||||
|
the need of an auxilary fan / system that circulates air through some sort of filtration system.
|
||||||
|
|
||||||
|
### Multi-Stage Systems
|
||||||
|
|
||||||
|
A challenge with multi-stage systems, even when sized properly, is that we often run at part-load conditions, and spend the majority of the
|
||||||
|
time in lower stages. The lower stages often do worse at dehumidification than when running at full load.
|
||||||
|
|
||||||
|
When the equipment runs in lower stages on a traditional system the total system airflow is reduced even further from the recommended air
|
||||||
|
changes per hour. This reduced airflow also causes the throw of the air from the registers to be reduced which can lead to increased odds of
|
||||||
|
stratification, poor air mixing, and increased potential for poor mean radiant temperatures (MRT) of the surfaces. The decreased airflow in
|
||||||
|
low stages, lowers the velocity in the duct system, while low velocity is not a concern, it does increase the duct gains and increase the
|
||||||
|
possibility of condensation on the ducts when they're located outside of the thermal envelope of the building.
|
||||||
|
|
||||||
|
Let's imagine we have a duct system that has high wall registers located in a soffit at the interior wall that moves 100 CFM and we are
|
||||||
|
trying to throw the air to the exterior wall which includes a window. The wall is @ 12 feet from the register. We've selected a register
|
||||||
|
that meets the criteria, at high stage airflow it has a throw of 11.5 feet (shown as the green rectangle). When the system runs in low
|
||||||
|
stage, the airflow is reduced to 70% of high stage (70 CFM), which would give us a throw from the register of @ 7 feet (shown as the red
|
||||||
|
rectangle).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The reduced flow through the register causes the air to only make it about 60% across the room before reaching it's terminal velocity, which
|
||||||
|
can cause the room to feel uncomfortable since the air never reaches the exterior wall and window.
|
||||||
|
|
||||||
|
By decoupling the fan from the coil airflow it is possible to run in low stages, still have adequate dehumidification performance out of the
|
||||||
|
system, and achieve the proper throw from the registers.
|
||||||
|
|
||||||
|
## Conclusion
|
||||||
|
|
||||||
|
In this article we've begun to scratch the surface of what a coil bypass strategy is in an HVAC system, as well as some of the challenges
|
||||||
|
that it can help solve. We've learned about why we may desire to decouple the total system airflow from the coil airflow.
|
||||||
|
|
||||||
|
In future articles we will continue to explore some of the features, benefits, and challenges presented by such a strategy.
|
||||||
|
|
||||||
|
## Related Resources
|
||||||
|
|
||||||
|
[HVAC School - Bypass Dehumidification / Airflow HVAC Design](https://hvacrschool.com/bypass-dehumidification-airflow-hvac-design/)
|
||||||
38
content/articles/2023-08-10-rss-feed.md
Normal file
38
content/articles/2023-08-10-rss-feed.md
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
tags: software, how-to
|
||||||
|
image: 2023-08-10-rss-feed.gif
|
||||||
|
---
|
||||||
|
|
||||||
|
# Rss Feed
|
||||||
|
|
||||||
|
In this article I will show how to add this site's rss feed. In particular, we will be using [NetNewsWire](https://netnewswire.com) as the
|
||||||
|
rss reader.
|
||||||
|
|
||||||
|
## What is an RSS Feed
|
||||||
|
|
||||||
|
An RSS feed will show you new posts, generally from a blog, without having to remember to check the website at regular intervals or signup
|
||||||
|
for an email list for notifications.
|
||||||
|
|
||||||
|
NetNewsWire puts an RSS feed as:
|
||||||
|
|
||||||
|
**It's like podcasts** - but for _reading._
|
||||||
|
|
||||||
|
You consume an RSS feed, using an RSS reader application or extension in your browser.
|
||||||
|
|
||||||
|
## Step One
|
||||||
|
|
||||||
|
First find and download an RSS reader, you can download [NetNewsWire](https://netnewswire.com) for macOS from the link, or for iOS from the
|
||||||
|
[AppStore](https://apps.apple.com/us/app/netnewswire-rss-reader/id1480640210).
|
||||||
|
|
||||||
|
## Step Two
|
||||||
|
|
||||||
|
Add the rss feed to stay up to date when I publish new articles.
|
||||||
|
|
||||||
|
1. Click the plus in the right side of the sidebar and select `New Feed...`
|
||||||
|
1. In the URL field add: `https://mhoush.com/articles/feed.xml`
|
||||||
|
1. Optionally give it a name
|
||||||
|
1. Click the `Add` button.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
That's it.
|
||||||
68
content/articles/2023-09-08-pounds-of-water-removed.md
Normal file
68
content/articles/2023-09-08-pounds-of-water-removed.md
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
---
|
||||||
|
tags: tech-tip, HVAC, formulas, psychrometrics, psychrometric-chart
|
||||||
|
---
|
||||||
|
|
||||||
|
# Pounds of Water Removed
|
||||||
|
|
||||||
|
This is an article that shows how to calculate the pounds of water removed from an air stream, given the entering conditions (return air
|
||||||
|
stream) and the outlet conditions (supply air stream).
|
||||||
|
|
||||||
|
This is useful in the field when you want to calculate the amount of moisture removed from an air-conditioner or a dehumidifier. This
|
||||||
|
article assumes that you have knowledge of a psychrometric chart. If you do not have basic knowledge of the psychrometric chart, then here
|
||||||
|
are a couple articles to familiarize yourself.
|
||||||
|
|
||||||
|
## Articles
|
||||||
|
|
||||||
|
- [Understand Dew-Point](https://hvacrschool.com/understand-dew-point-absolute-moisture-right-side-psych-chart/)
|
||||||
|
- [Impact of Adding or Removing Water from Air](https://hvacrschool.com/the-impact-of-adding-or-removing-water-from-air/)
|
||||||
|
|
||||||
|
## Scenario
|
||||||
|
|
||||||
|
Let's imagine that we have an air-conditioner that has the following measurements taken:
|
||||||
|
|
||||||
|
- Return Air: 75° / 50% RH
|
||||||
|
- Supply Air: 55° / 81% RH
|
||||||
|
|
||||||
|
We plot the two values on the psychrometric chart (black line represents the return air conditions and blue line represents the supply air
|
||||||
|
conditions).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
We start by finding the corresponding dry-bulb temperature at the bottom of the chart and draw a straight line up to where it intersects the
|
||||||
|
relative humidity curve. After that we draw a straight line to the right side of the psychrometric chart to find the grains of moisture per
|
||||||
|
pound of air.
|
||||||
|
|
||||||
|
This gives us the following values:
|
||||||
|
|
||||||
|
- Return Air: 66 gr/lb
|
||||||
|
- Supply Air: 52 gr/lb
|
||||||
|
|
||||||
|
We can then use the following formula to calculate the pounds of water removed.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
| **Where** | |
|
||||||
|
| ------------ | -------------------------------------------------------- |
|
||||||
|
| **W** | _Weight of water in pounds per hour_ |
|
||||||
|
| **4.5** | _Constant based on density / specific heat of moist air_ |
|
||||||
|
| **CFM** | _Airflow in cubic feet per minute_ |
|
||||||
|
| **∆G** | _Difference in grains of moisture_ |
|
||||||
|
| **7000** | _Constant based on grains of moisture in saturated air_ |
|
||||||
|
|
||||||
|
## Solution
|
||||||
|
|
||||||
|
First, we solve for the difference in grains between the two air streams.
|
||||||
|
|
||||||
|
∆G = 66 - 52 = 14
|
||||||
|
|
||||||
|
Next, we've measured our airflow and have determined to have **797 CFM** of airflow across the evaporator coil, so we can substitute our
|
||||||
|
values into the formula.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
So, we are removing about 7 pounds of water per hour at these conditions.
|
||||||
|
|
||||||
|
Another thing to note is that 1 pound of water is approximately 1 pint of water, which can be useful when working with dehumidifiers that
|
||||||
|
can often be rated in pints per day.
|
||||||
|
|
||||||
|
I hope you've found this article helpful, thanks for reading!
|
||||||
66
content/articles/2023-09-14-why-mini-splits-stink.md
Normal file
66
content/articles/2023-09-14-why-mini-splits-stink.md
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
---
|
||||||
|
tags: HVAC
|
||||||
|
---
|
||||||
|
|
||||||
|
# Why Mini Splits Stink
|
||||||
|
|
||||||
|
In this general article, I explain why I don't generally like to use mini-splits.
|
||||||
|
|
||||||
|
## The Positive Sides
|
||||||
|
|
||||||
|
When people say mini-splits, in general we mean "ductless" style units. These can either be high wall, floor mounted, or ceiling mounted
|
||||||
|
consoles. These units do offer really high efficiency and becuase they're "ductless" you don't have duct gains/losses.
|
||||||
|
|
||||||
|
These units are common in many other countries and have been around for a long time. They do are generally quick and fairly easy to install,
|
||||||
|
but are mostly a pain in the tail to work on.
|
||||||
|
|
||||||
|
So, the plus side to these units are that they are really efficient, they generally have models that have a high-heat output for colder
|
||||||
|
climates, although this option is becoming more prevelant in traditional unitary style heat pumps as well. You do not have heat gains or
|
||||||
|
losses due to ductwork being in unconditioned spaces.
|
||||||
|
|
||||||
|
## The Down Sides
|
||||||
|
|
||||||
|
Most mini-split systems do not do the greatest at humidity removal. This is partially because they use proprietary algorithms to control the
|
||||||
|
blower and compressor. They do achieve long run-times, which is often good for comfort stand points, however there is generally not a good
|
||||||
|
way to control / hack them to work towards achieving good IAQ.
|
||||||
|
|
||||||
|
These units offer next to no filtration, so in order to have filtration you need to utilize a stand-alone / portable filtration means. Which
|
||||||
|
a lot of the portable filtration systems have problems of their own (come bundled with UV / PCO technology or other "space" technology that
|
||||||
|
can lead to their own IAQ problems). It also introduces another fan, which may / may not be that efficient. In other words, when considering
|
||||||
|
other items to make them more comparable to what a traditional system offers, are they really that much more efficient?
|
||||||
|
|
||||||
|
These systems also do not have a good method of offering basic fresh air control / management, so other systems, such as an ERV need to be
|
||||||
|
installed to handle the fresh air requirements of the building.
|
||||||
|
|
||||||
|
The controls for these systems are often hard to understand / use. They do allow you to change fan speeds, but they control the compressor.
|
||||||
|
The fans often run all the time, which is not necessarily a bad thing, but they don't really offer many ramping profiles or adjustments to
|
||||||
|
change the blower speed when the compressor is off vs. on.
|
||||||
|
|
||||||
|
These systems get dirty quickly, are generally a pain to clean properly, and are not easily repairable. Manufacturer support is often poor,
|
||||||
|
the documents aren't always translated very well, and most technicians hate to work on them.
|
||||||
|
|
||||||
|
# What about ducted models?
|
||||||
|
|
||||||
|
But what about the ducted models? Well, the ducted models are a step in the right direction. You can use filters on them, although some of
|
||||||
|
the manufacturer's do not recommend installing better / improved filter cabinets (like a 4-5" media filter), however we have done that
|
||||||
|
successfully many times and always include media filters as an option on our installations, but you do need to make sure that they have a
|
||||||
|
very low pressure drop, as they a lot are not designed for very much static pressure.
|
||||||
|
|
||||||
|
The ducted models still generally have the same control problems, previously mentioned. If you read my introduction to the
|
||||||
|
[coil-bypass-system](https://mhoush.com/posts/coil-bypass-overview/), you have a basic understanding that even most traditional systems /
|
||||||
|
designers do not focus on the proper air-changes in a structure to maintain proper IAQ levels.
|
||||||
|
|
||||||
|
You can't easily pair mini-splits with larger fan-coils because they are "communicating" style systems.
|
||||||
|
|
||||||
|
## Conclusion
|
||||||
|
|
||||||
|
Don't get me wrong, there are applications that are well suited for mini-splits. These are often applications like sun-rooms, garages, small
|
||||||
|
server-rooms / network storage rooms, and many others. But in my opinion these are not at all my favorite and are generally really far down
|
||||||
|
my list of options that I want to recommend to my clients.
|
||||||
|
|
||||||
|
As an industry, I feel we need to step back and refocus on the pillars of IAQ. Filtration, fresh-air, and humidity control. The
|
||||||
|
manufacturers / government should put less emphasis on chasing efficiency just to shoot ourselves in the foot and loose the qualities that
|
||||||
|
make traditional / unitary style systems cover more if not all of the 3 pillars of proper IAQ.
|
||||||
|
|
||||||
|
There's plenty that I did not cover and I'm sure I missed some things, but just needed to rant for a few minutes... Thank you for making it
|
||||||
|
to the end!
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
---
|
||||||
|
tags: tech-tip, HVAC, formulas, design
|
||||||
|
---
|
||||||
|
|
||||||
|
# Dehumidifier Sizing by Latent Load
|
||||||
|
|
||||||
|
This is a quick article to show how to calculate the size of dehumidifier needed based on the latent load of a building. This is useful if
|
||||||
|
you've done a load calculation and know the latent load of the structure.
|
||||||
|
|
||||||
|
## Formulas
|
||||||
|
|
||||||
|
The formula above is used to solve for the pints per hour required to size a dehumidifier.
|
||||||
|
|
||||||
|
| Where | |
|
||||||
|
| ----- | ------------ |
|
||||||
|
| Ql | Latent load |
|
||||||
|
| Ph | Pints / hour |
|
||||||
|
|
||||||
|
We can then convert to pints per day by multiplying the answer by 24 hours, below is the combined formula.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
| Where | |
|
||||||
|
| ----- | ----------- |
|
||||||
|
| Ql | Latent load |
|
||||||
|
| Pd | Pints / day |
|
||||||
|
|
||||||
|
In some cases you may want to size the dehumidifier for less than the full latent load, assuming that the air-conditioner (when sized
|
||||||
|
properly) is going to cover the full latent load when at peak design temperatures and that the peak latent period for your area is during
|
||||||
|
peak cooling demand.
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Let's imagine we have done a load calculation and have a latent load of 4,334 BTU/h. So, plugging that into our above formula.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Or if we just want to cover the latent capacity at 85% of the full latent load.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
This gives us some guidance that we would need to select a dehumidifier that is rated for 84-99 pints per day, depending on which condition
|
||||||
|
we wanted to use.
|
||||||
|
|
||||||
|
I don't feel oversizing a dehumidifier, within reason, is that problematic (or at least it does not come with the same problems as an
|
||||||
|
oversized air conditioner), so I would personally go for a 100-120 pint per day model dehumidifier in this application.
|
||||||
|
|
||||||
|
Thanks for reading!
|
||||||
102
content/articles/2023-09-18-introducing-psychrometrics-cli.md
Normal file
102
content/articles/2023-09-18-introducing-psychrometrics-cli.md
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
---
|
||||||
|
tags: HVAC, psychrometrics, software
|
||||||
|
title: "Introducing Psychrometrics Cli"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Introducing Psychrometrics CLI
|
||||||
|
|
||||||
|
Today, I'm releasing a command line application that is built on top of my
|
||||||
|
[swift-psychrometrics](https://github.com/swift-psychrometrics/swift-psychrometrics) package, that I open sourced over 2 years ago.
|
||||||
|
|
||||||
|
The application consists of many calculations / conversions for psychrometric properties of an air stream. The tool works for both imperial
|
||||||
|
and metric units. The application will work natively on macOS, but can also be ran through a `docker` container on other platforms.
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
I spend a lot of time in my terminal, because I can work so much more efficiently. I discovered many years ago that the more I can do using
|
||||||
|
simple applications and keyboard over a mouse and a web browser or native application the more I can accomplish. I understand this is
|
||||||
|
intimidating for many who think they are _"not good with computers"._ I can assure that was me several years ago, I would only encourage you
|
||||||
|
to not be afraid and give it a shot. We are at a time in society where it is easier than ever to get informed and learned new skills.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
For complete installation instructions, you can view the [github](https://github.com/swift-psychrometrics/psychrometrics-cli) repository.
|
||||||
|
|
||||||
|
The following instructions are based on using macOS.
|
||||||
|
|
||||||
|
### Open your terminal application.
|
||||||
|
|
||||||
|
Personally, I use [iTerm2](https://iterm2.com/), however you can use the default `Terminal` app. Found at
|
||||||
|
`/Applications/Utilities/Terminal.app`.
|
||||||
|
|
||||||
|
## Install Homebrew
|
||||||
|
|
||||||
|
We use [Homebrew](https://brew.sh) for package distribution of the pre-built application binaries. You can follow their instructions to
|
||||||
|
install.
|
||||||
|
|
||||||
|
### Tap our custom formula tap.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
brew tap swift-psychrometrics/formula
|
||||||
|
```
|
||||||
|
|
||||||
|
### Install the psychrometrics application
|
||||||
|
|
||||||
|
```bash
|
||||||
|
brew install psychrometrics
|
||||||
|
```
|
||||||
|
|
||||||
|
That's it!
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
I will run through a couple of the commands that are supplied with the application and show what you can expect the outputs to be.
|
||||||
|
|
||||||
|
### Properties
|
||||||
|
|
||||||
|
The following command will output a bunch of the psychrometric properties of an air stream. There are several ways to call it, but generally
|
||||||
|
you will supply the dry bulb temperature and the relative humidity.
|
||||||
|
|
||||||
|
Below, we calculate the psychrometric properties based on 75°F and 50% humidity.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
psychrometrics --dry-bulb 75 --relative-humidity 50
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Dehumidifier Sizing
|
||||||
|
|
||||||
|
If you've read some of my recent articles on calculating the
|
||||||
|
[dehumidifier size required based on the latent load](https://mhoush.com/posts/sizing-dehumidifier-by-latent-load/), the application also
|
||||||
|
ships with a calculation that will do this for you and has the ability to calculate it at different `coverages` that you can supply.
|
||||||
|
|
||||||
|
For example if we've done a load calculation and determined that we have a latent load of `4,334 BTU/h` then we could run the following
|
||||||
|
command to see what size dehumidifier is needed for `100%, 85%, and 70%` of the latent load.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
psychrometrics dh size --coverage 100 85 70 --verbose 4334
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Pounds of Water Removed
|
||||||
|
|
||||||
|
I also recently wrote an article about [calculating the pounds of water removed](https://mhoush.com/posts/pounds-of-water-removed/) from an
|
||||||
|
air stream given the grains of moisture removed.
|
||||||
|
|
||||||
|
Below is an example of calculating the pounds of water removed per hour based on the example in the article (14 delta-grains)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
psychrometrics dh pounds-removed --delta 14 --cfm 797 --verbose
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Help
|
||||||
|
|
||||||
|
You can use `--help` option to show help and the list of commands provided.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
If you have any questions then feel free to email or message me. I hope some of you may find this application useful.
|
||||||
@@ -0,0 +1,241 @@
|
|||||||
|
---
|
||||||
|
tags: HVAC, programming, software
|
||||||
|
---
|
||||||
|
|
||||||
|
# Introduction to Programming for HVAC Part-1
|
||||||
|
|
||||||
|
This is part one of a series of articles to help HVAC technicians (or others) get started in developing their skills to program. This can
|
||||||
|
help to automate everyday tasks or just familiarize themselves with some of the tools used by programmers.
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
I think if nothing else, this series can help gain knowledge, tips, and tricks to make you more comfortable with your computer. I hope that
|
||||||
|
you will at least learn how to use your `terminal` application and more specifically `vim` motions and keybindings (more on that in another
|
||||||
|
article).
|
||||||
|
|
||||||
|
The goal of this article is to just get a machine setup with tools and to start exploring. I am a shill for `macOS`, so all of these will be
|
||||||
|
specifically geared towards that and my workflows, most everything that is showcased should also work on `linux` machines (not sure about
|
||||||
|
`windows`), although you may have to search for specific instructions on installing software for other platforms.
|
||||||
|
|
||||||
|
What I have learned on my journey in programming is that the more you can lean on small software packages that focus on a single task, but
|
||||||
|
do them well, the better. The less you use your mouse, the more productive you can be. The more you can work with `text` files and formats
|
||||||
|
the more portable and transformable your workflows can be.
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
The first thing that we will focus on is becoming familiar with the terminal application. On macOS the terminal application is located at
|
||||||
|
`/Applications/Utilities/Terminal.app`. However, rather than click around to find it, you can use the `⌘<space>` to pull up your spotlight
|
||||||
|
search, then type `Terminal` to select the terminal application.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Terminal Overview
|
||||||
|
|
||||||
|
Your terminal is a program that allows you to run programs by typing commands into it's window. There are a lot of built-in commands and a
|
||||||
|
bunch that you can install. The terminal is very customizable (and once familiar, you will constantly be tweaking / adjusting to suit your
|
||||||
|
needs). Right now customization is not what we will focus on, however in future articles I will provide tips and tricks on customizing it.
|
||||||
|
Right now, we only need to know how to open it up and type in commands.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Below is an image / explanation of what the default status line includes.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Learn Basic Commands (Built-in)
|
||||||
|
|
||||||
|
Here are a few basic commands that you should familiarize yourself with, as you will use them often when working inside of a terminal.
|
||||||
|
|
||||||
|
### Change Directory
|
||||||
|
|
||||||
|
`cd` (change directory) is the command that allows you to move around your file system when inside the terminal.
|
||||||
|
|
||||||
|
> **Note:** `~` is a representation of your `Home` directory.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/Documents
|
||||||
|
```
|
||||||
|
|
||||||
|
The above command will move you into your Documents directory.
|
||||||
|
|
||||||
|
> **Note:** If there are spaces in the name of the directory you try to move to then the easiest way is to wrap the name in quotes.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd "~/Documents/Product Concepts"
|
||||||
|
```
|
||||||
|
|
||||||
|
Some other things to understand when moving around / supplying arguments to the `cd` command.
|
||||||
|
|
||||||
|
You can use `..` to go backwards / move up to the parent directory. For example, say we are in the `~/Documents` directory, to go back up to
|
||||||
|
the home directory we could use the following:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ..
|
||||||
|
```
|
||||||
|
|
||||||
|
These can be chained together as well. For example say we are located in the `~/Documents/Product Concepts` directory, we could use the
|
||||||
|
following to go up two directory levels back to the home directory.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ../..
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Pro-Tip:** You can use the `<tab>` key when navigating to auto-complete, generally typing a few characters followed with the `<tab>` key
|
||||||
|
> will auto-complete for you.
|
||||||
|
|
||||||
|
### List files
|
||||||
|
|
||||||
|
Use `ls` to output a list of files and directories where you are located.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ls
|
||||||
|
```
|
||||||
|
|
||||||
|
_Example Output when in my ~/Documents directory_
|
||||||
|
|
||||||
|
```bash
|
||||||
|
Estimates.app
|
||||||
|
InkscapeDrawings
|
||||||
|
KwikModel
|
||||||
|
MyAparment
|
||||||
|
NCISummit
|
||||||
|
Personal
|
||||||
|
Product Concepts
|
||||||
|
Receipts.receipts
|
||||||
|
RingCentral
|
||||||
|
SketchUP
|
||||||
|
Tech-Tips
|
||||||
|
desktop.ini
|
||||||
|
espanso-migrate-backup
|
||||||
|
espanso-migrate-backup-2
|
||||||
|
```
|
||||||
|
|
||||||
|
Using options with `ls` to show more statistics and hidden files. There are often hidden files on your computer that are used for
|
||||||
|
application support or other purposes, these files are not shown using the default command. Hidden files start with a `.`, below is an
|
||||||
|
example of showing hidden files in your home directory.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ls -la ~/
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Note:** Above I added the `~/` which will allow you to list the files in your home directory even if you currently are not there in your
|
||||||
|
> terminal, if you were already there (for example by using `cd ~/` then you would not need to use that at the end of the command.
|
||||||
|
|
||||||
|
_Example Output_
|
||||||
|
|
||||||
|
```
|
||||||
|
total 168
|
||||||
|
drwxr-xr-x+ 46 michael staff 1472 Sep 22 10:45 .
|
||||||
|
drwxr-xr-x 6 root admin 192 Sep 22 09:08 ..
|
||||||
|
-r-------- 1 michael staff 7 Apr 8 2021 .CFUserTextEncoding
|
||||||
|
-rw-r--r--@ 1 michael staff 14340 Sep 18 10:15 .DS_Store
|
||||||
|
drwx------+ 5 michael staff 160 Sep 20 17:03 .Trash
|
||||||
|
-rw-r--r-- 1 michael staff 186 Sep 12 15:20 .actrc
|
||||||
|
drwxr-xr-x 4 michael staff 128 Dec 13 2021 .bin
|
||||||
|
drwxr-xr-x 3 michael staff 96 Mar 6 2023 .bundle
|
||||||
|
drwxr-xr-x 7 michael staff 224 Sep 12 11:40 .cabal
|
||||||
|
drwxr-xr-x 7 michael staff 224 Sep 12 15:20 .cache
|
||||||
|
drwxr-xr-x 13 michael staff 416 Aug 10 08:47 .config
|
||||||
|
drwx------ 3 michael staff 96 Jun 21 2021 .cups
|
||||||
|
drwxr-xr-x 12 michael staff 384 Sep 15 15:22 .docker
|
||||||
|
drwxr-xr-x 20 michael staff 640 Sep 19 08:11 .dotfiles
|
||||||
|
drwxr-xr-x 4 michael staff 128 Jul 26 2021 .gem
|
||||||
|
drwxr-xr-x 3 michael staff 96 Oct 11 2021 .jssc
|
||||||
|
-rw------- 1 michael staff 20 Sep 22 10:45 .lesshst
|
||||||
|
drwxr-x--- 3 michael staff 96 Mar 29 08:47 .lldb
|
||||||
|
drwxr-xr-x 8 michael staff 256 Mar 1 2023 .local
|
||||||
|
drwxr-xr-x 4 root staff 128 Apr 12 2021 .newtek
|
||||||
|
drwxr-xr-x 5 michael staff 160 Dec 13 2021 .npm
|
||||||
|
-rw------- 1 michael staff 27436 Apr 10 10:21 .psql_history
|
||||||
|
drwxr-xr-x 7 michael staff 224 Apr 18 2022 .ssh
|
||||||
|
drwxr-xr-x 6 michael staff 192 Sep 21 09:06 .swiftpm
|
||||||
|
lrwxr-xr-x 1 michael staff 25 Dec 27 2021 .tmux.conf -> .dotfiles/tmux/.tmux.conf
|
||||||
|
drwxr-xr-x 8 michael staff 256 Mar 27 16:14 .twilio-cli
|
||||||
|
drwxr-xr-x 6 michael staff 192 Sep 18 11:08 .vim
|
||||||
|
-rw------- 1 michael staff 23086 Sep 21 09:45 .viminfo
|
||||||
|
-rw-r--r-- 1 michael staff 254 Sep 21 09:32 .wget-hsts
|
||||||
|
lrwxr-xr-x 1 michael staff 43 Jan 3 2022 .zshenv -> /Users/michael/.dotfiles/zsh/config/.zshenv
|
||||||
|
drwxr-xr-x 8 michael staff 256 Dec 14 2021 AmazonWorkDocsCompanion
|
||||||
|
drwx------@ 4 michael staff 128 Dec 13 2021 Applications
|
||||||
|
lrwxr-xr-x 1 michael staff 40 Jun 6 12:00 Applications (Parallels) -> /Volumes/Bucket/Applications (Parallels)
|
||||||
|
drwx------@ 30 michael staff 960 Sep 21 08:54 Desktop
|
||||||
|
drwx------@ 19 michael staff 608 Sep 14 10:15 Documents
|
||||||
|
drwx------@ 21 michael staff 672 Sep 21 09:43 Downloads
|
||||||
|
drwx------+ 115 michael staff 3680 Sep 14 10:04 Library
|
||||||
|
drwxr-xr-x 3 michael staff 96 Sep 8 13:06 LocalProjects
|
||||||
|
lrwxr-xr-x 1 michael staff 29 Dec 30 2021 Movies -> /Volumes/Bucket/Videos/Movies
|
||||||
|
lrwxr-xr-x 1 michael staff 21 Dec 30 2021 Music -> /Volumes/Bucket/Music
|
||||||
|
drwx------@ 2 michael staff 64 Mar 6 2023 Parallels
|
||||||
|
drwx------@ 7 michael staff 224 Sep 14 09:52 Pictures
|
||||||
|
drwxr-x---+ 4 michael staff 128 Apr 8 2021 Public
|
||||||
|
drwxr-xr-x+ 3 michael staff 96 Sep 14 09:52 Sites
|
||||||
|
drwxr-xr-x 3 michael staff 96 Jun 7 2021 WorkDocs Drive
|
||||||
|
drwxr-xr-x 3 michael staff 96 Sep 18 11:36 go
|
||||||
|
```
|
||||||
|
|
||||||
|
As you can see, I have a lot of hidden files and folders, your output will probably look much different than mine.
|
||||||
|
|
||||||
|
### Clearing the Terminal
|
||||||
|
|
||||||
|
Often times you may want to clear the terminal screen. You can use the `clear` command to clear the screen of the terminal.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
clear
|
||||||
|
```
|
||||||
|
|
||||||
|
Or use a keyboard shortcut `⌃l` (`<control>l`)
|
||||||
|
|
||||||
|
### Creating Directories
|
||||||
|
|
||||||
|
Use `mkdir` (make directory) to create a directory.
|
||||||
|
|
||||||
|
First, let's move into the `tmp` directory, the `tmp` directory is a directory on your file system that is typically used for applications
|
||||||
|
to write temporary logs / files to, it get's erased everytime your computer is restarted. We can use the `cd` command that we learned
|
||||||
|
earlier.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /tmp
|
||||||
|
```
|
||||||
|
|
||||||
|
Next, let's create a new directory called "MyDirectory".
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir MyDirectory
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Gotcha's with 'mkdir'
|
||||||
|
|
||||||
|
By default you can't create directories that are multiple levels deep, unless the directories already existed or we provide the `-p` option.
|
||||||
|
For example, if we want to create a directory at `/tmp/MyOtherDirectory/Nested/Deeply` then we could use the following command when inside
|
||||||
|
the `tmp` directory.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir -p MyOtherDirectory/Nested/Deeply
|
||||||
|
```
|
||||||
|
|
||||||
|
Now, try out using the `<tab>` key with the `cd` command to navigate to the `Deeply` folder.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd MyOther <tab> <tab> <tab>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Open Command
|
||||||
|
|
||||||
|
You can use the open command to open files or folders in the default application for the file type.
|
||||||
|
|
||||||
|
For example, if we want to open a `Finder` window while in the `/tmp` directory, we can use the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
open .
|
||||||
|
```
|
||||||
|
|
||||||
|
### Manual Pages
|
||||||
|
|
||||||
|
Lastly, to learn more about commands you can use the `man <command>`. To bring up the manual pages for the command in the terminal. You can
|
||||||
|
use the arrow keys to navigate around the manual pages and type the letter `q` to quit / close the manual pages.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
man ls
|
||||||
|
```
|
||||||
|
|
||||||
|
That is it for the first installment in this series. I hope you learned something and have better understanding of using your terminal.
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
---
|
||||||
|
tags: HVAC, programming, software
|
||||||
|
title: "Introduction to Programming for HVAC Part-2"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Introduction to Programming for HVAC Part-2
|
||||||
|
|
||||||
|
In this article, learn about installing a package manager. If you missed it, check out the
|
||||||
|
[first](https://mhoush.com/posts/introduction-to-programming-for-hvac-1/) article in the series where we learned about using your terminal.
|
||||||
|
This article builds upon that foundation.
|
||||||
|
|
||||||
|
## What is a Package Manager
|
||||||
|
|
||||||
|
A package manager is a piece of software that helps to install software and manage updates for your system. For me, the first thing that I
|
||||||
|
do with a new machine is install `Homebrew`. [Homebrew](https://brew.sh) is my preferred package manager for `macOS`.
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
A package manager is nice because often software relies / requires other dependencies in order to work properly. By using a package manager
|
||||||
|
it will make sure that the correct dependencies are installed for the software that you need to run. It allows you to be able to update and
|
||||||
|
manage software through a centralized interface.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Installation is simple. Open up your terminal and enter the following command (easiest to just copy / paste from the homepage linked above).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||||||
|
```
|
||||||
|
|
||||||
|
This will prompt you for your password in order to create some directories and install the required software for `brew` to work. The
|
||||||
|
installation may take some time, while it downloads the command line tools for `Xcode`.
|
||||||
|
|
||||||
|
When completed, follow the `Next Steps` and copy / paste the command listed, that should look like below.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
(echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/<you>/.zprofile
|
||||||
|
eval "$(/opt/homebrew/bin/brew shellenv)"
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The first line of this command sets up some things in your shell profile (which we have not discussed yet) that will make `Homebrew`
|
||||||
|
available to you anytime you start a new session in your terminal. The second line of the command makes it available in your current
|
||||||
|
terminal session.
|
||||||
|
|
||||||
|
Next run the following command and make sure that everything is setup correctly.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
brew doctor
|
||||||
|
```
|
||||||
|
|
||||||
|
Which should output the following:
|
||||||
|
|
||||||
|
```
|
||||||
|
Your system is ready to brew.
|
||||||
|
```
|
||||||
|
|
||||||
|
### Terminology
|
||||||
|
|
||||||
|
Homebrew calls command line applications `formula` and normal graphical applications `casks`. It has the ability to install both styles of
|
||||||
|
applications.
|
||||||
|
|
||||||
|
## Search Command
|
||||||
|
|
||||||
|
The following command is used to search for software packages:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
brew search chrome
|
||||||
|
```
|
||||||
|
|
||||||
|
## Open a Homepage
|
||||||
|
|
||||||
|
The following command can be used to view the homepage of a formula or cask in your browser:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
brew home google-chrome
|
||||||
|
```
|
||||||
|
|
||||||
|
## Update Homebrew
|
||||||
|
|
||||||
|
The following command is used to update homebrew:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
brew update
|
||||||
|
```
|
||||||
|
|
||||||
|
## Update packages installed on your system
|
||||||
|
|
||||||
|
The following command is used to update software that is installed / managed by homebrew.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
brew upgrade
|
||||||
|
```
|
||||||
|
|
||||||
|
You can combine the update and upgrade commands, which will update homebrew and upgrade all the software it manages on you machine with the
|
||||||
|
following command.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
brew update && brew upgrade
|
||||||
|
```
|
||||||
|
|
||||||
|
## Conclusion
|
||||||
|
|
||||||
|
That is it for this article. I will say that for me, when I find a piece of software that I want to use, I generally try to search for it in
|
||||||
|
`brew` first, before installing it via other means.
|
||||||
|
|
||||||
|
I hope you've found this article helpful. In the next article we will start to use the skills that we've learned in these first two articles
|
||||||
|
and write our first program / script.
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
---
|
||||||
|
tags: HVAC, programming, software
|
||||||
|
---
|
||||||
|
|
||||||
|
# Introduction to Programming for HVAC Part-3
|
||||||
|
|
||||||
|
In this article we will put together some of the pieces from the last 2 articles, and build our first program. If you have missed the first
|
||||||
|
articles, then you can catch up [here](https://mhoush.com/series/programming-for-hvac/) before continuing with this article.
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
We are going to make our first script / program. This first program is really just setting up some building blocks for our next program we
|
||||||
|
will write, that will remove the background from an image.
|
||||||
|
|
||||||
|
### Creating a scripts directory
|
||||||
|
|
||||||
|
We learned in the [first article](https://mhoush.com/posts/introduction-to-programming-for-hvac-1/) how to use our terminal. Today we are
|
||||||
|
going to use some of the commands we learned to create a directory where we can store our script and future scripts that we write.
|
||||||
|
|
||||||
|
**Create a directory**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir -p ~/.local/bin
|
||||||
|
```
|
||||||
|
|
||||||
|
The above command will create a "hidden" directory in your home folder. We can go ahead and move into the directory we just created.
|
||||||
|
|
||||||
|
> **Note:** The `-p` option allows us to create nested directories if the parent directory doesn't exist.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/.local/bin
|
||||||
|
```
|
||||||
|
|
||||||
|
### Hello World
|
||||||
|
|
||||||
|
It is common in programming to start out with a "Hello World" program when learning a new scripting paradigm. So let's jump in and get
|
||||||
|
started.
|
||||||
|
|
||||||
|
**Creating our script file:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
touch hello-world.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
**Now open the file:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
open hello-world.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
The above command should open the file in the `TextEdit` application. In order to make the text edit application to not auto-capitalize
|
||||||
|
words and play more nicely, we need to adjust some settings. Open the settings by pressing `⌘,`.
|
||||||
|
|
||||||
|
In the **Format** section, select _Plain text_ and in the **Options** section de-select _Check spelling as you type_.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
At this point for changes to take place, you will need to close the file and re-open.
|
||||||
|
|
||||||
|
> **Tip:** In your terminal you can run the last command in your history by using the `↑` (Up) arrow key.
|
||||||
|
|
||||||
|
Now that the file is open again, we will write our hello-world program. The contents of your file should look like the following:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
echo 'Hello World!'
|
||||||
|
```
|
||||||
|
|
||||||
|
The first line is referred to as the `shebang`, this tells your computer which shell interperter to run your file. I have not explained the
|
||||||
|
shell yet, but it currently would just muddy the waters a bit, but there are several shell interperters on your computer with the `sh` posix
|
||||||
|
shell being one of the most universal / lowest level ones, which is why I'm choosing this one (in other words this script would work on just
|
||||||
|
about any machine you were on).
|
||||||
|
|
||||||
|
The second line we are using the built-in `echo` command and passing it the 'Hello World!' argument.
|
||||||
|
|
||||||
|
Now save and close the file `⌘s` (to save) `⌘q` (to quit the text edit application).
|
||||||
|
|
||||||
|
**Run the program from your terminal:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
/bin/sh hello-world.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
You should see that `Hello World!` was printed to your console.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Make Executable
|
||||||
|
|
||||||
|
Now that we have our basic script working, let's make it an executable.
|
||||||
|
|
||||||
|
**In your terminal, type the following:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
chmod u+x hello-world.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
This will change the mode of the file type to be an executable.
|
||||||
|
|
||||||
|
Now move / rename the file so we don't have to call it using `.sh` extension:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mv hello-world.sh hello-world
|
||||||
|
```
|
||||||
|
|
||||||
|
Now that the file is executable, we can execute it by just calling the name of the file.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./hello-world
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Note:** We have to prefix the file name with `./` in the above command so that it knows where to find our file. The `./` is saying run
|
||||||
|
> this file in our current directory. In the future we will setup our shell so that it knows to look in our `~/.local/bin` directory for
|
||||||
|
> scripts, so that we can call them without this prefix.
|
||||||
|
|
||||||
|
## Conclusion
|
||||||
|
|
||||||
|
Congratulations, in this article we wrote our first program. We learned how to edit the file, set it's permissions, and execute the program
|
||||||
|
from our terminal. I should mention that the `TextEdit` application is generally not how you would program, people typically use what is
|
||||||
|
known as an `IDE (integrated development environment)`, however I chose to use the `TextEdit` application because it is built-in to `macOS`
|
||||||
|
and allowed us to accomplish our goal without downloading other software.
|
||||||
|
|
||||||
|
In our upcoming articles, we will write a program that I hope is useful to you / something that you can build upon and use for a long time.
|
||||||
|
Thank you for reading to this point.
|
||||||
@@ -0,0 +1,205 @@
|
|||||||
|
---
|
||||||
|
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
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> **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.
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
---
|
||||||
|
tags: HVAC
|
||||||
|
---
|
||||||
|
|
||||||
|
# Free quotes != good
|
||||||
|
|
||||||
|
I found myself re-reading the
|
||||||
|
[ACCA Quality Installation Standard](https://www.acca.org/communities/community-home/librarydocuments/viewdocument?DocumentKey=b1d2a39d-fda8-4af9-b8de-0ae579bfe24a)
|
||||||
|
recently and it got me thinking about the industries tendency of offering free quotes. In this article, I'd like to just focus in on the
|
||||||
|
items that are required as what I'm calling "prior to installation" items.
|
||||||
|
|
||||||
|
## Prior to installation
|
||||||
|
|
||||||
|
1. Ensure ventilation calculations are performed.
|
||||||
|
1. Building heat gain / loss calculation (Manual-J / Manual-N)
|
||||||
|
1. Room x room for new construction or duct modifications.
|
||||||
|
1. Block load for existing (can use original if available).
|
||||||
|
1. Proper equipment capacity selection (Manual-S / Manual-CS)
|
||||||
|
1. Properly matched systems (AHRI or CEE-AHRI)
|
||||||
|
|
||||||
|
Let's break the above items down to a rough estimated time to complete each of the items.
|
||||||
|
|
||||||
|
| Item | Time (minutes) |
|
||||||
|
| ----------------------------------- | -------------- |
|
||||||
|
| Ventilation calculations | 15 |
|
||||||
|
| Manual-J (data gathering) | 30 |
|
||||||
|
| Manual-J (data entry / calculation) | 30 |
|
||||||
|
| Manual-S | 15 |
|
||||||
|
| AHRI | 15 |
|
||||||
|
| **Total** | 105 |
|
||||||
|
|
||||||
|
> _The above items are obviously just estimations and the person's experience in the different areas / tools they use. Some of the items are
|
||||||
|
> probably on the low side while others are probably on the high side._
|
||||||
|
|
||||||
|
This is 1.75 hours just to do the calculations required to meet the QI Standard. This does not include any of the time spent with the
|
||||||
|
customer building value in you or your product recommendations.
|
||||||
|
|
||||||
|
When you want to not guess at some of the calculations then a blower door test is generally required in order to understand the leakage of
|
||||||
|
the home, which adds even more time to the estimation process. Depending on the understanding you are looking for, the blower door test can
|
||||||
|
add 30-180 minutes. This takes the total time to 2.25-4.75 hours.
|
||||||
|
|
||||||
|
## Pushing boxes
|
||||||
|
|
||||||
|
The majority of residential HVAC companies make the bulk of their income off of equipment sales, so they have to "feed the beast" by
|
||||||
|
skipping steps in both the installation of equipment and the sales process in order to close jobs and keep the ship afloat.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
This has helped contribute to these industry statistics:[^1]
|
||||||
|
|
||||||
|
- **Incorrect refrigerant charge in greater than 50-80% of systems.**
|
||||||
|
- **Improper airflow:**
|
||||||
|
- **70% above the rated 0.5" w.c.**
|
||||||
|
- **47% above 0.7" w.c.**
|
||||||
|
- **85% undersized / inappropriate filter.**
|
||||||
|
- **70-80% of systems have at least one fault.**
|
||||||
|
- **90-100% if duct leakage is considered.**
|
||||||
|
|
||||||
|
## Consumer responsibility
|
||||||
|
|
||||||
|
Let me be clear, I don't think that all the blame is on the industry here. The culture today is that everyone wants things for free and
|
||||||
|
fast. They have been conditioned by online services and box stores. Should we not cater to those that aren't willing to do their leg work?
|
||||||
|
Is it really our fault, if they don't care?
|
||||||
|
|
||||||
|
## Liability
|
||||||
|
|
||||||
|
While it's generally easy to shrug our shoulders and think that it's ok to just continue on because all the competitors are doing the same
|
||||||
|
thing. There is at least the possibility that skipping steps can come back to bite you. If things ever went to litigation and the steps
|
||||||
|
outlined in the QI Standard are ignored, then there is high odds you would loose.
|
||||||
|
|
||||||
|
No matter what you do to try and protect yourself (having customers sign-off, etc) does not adequately protect your company from litigation.
|
||||||
|
There are stories out there where contractors were still held liable for not performing load calculations even though the consumer signed
|
||||||
|
off on it, because it is not inline with "industry best practices."
|
||||||
|
|
||||||
|
# Summary
|
||||||
|
|
||||||
|
This has led me to the conclusion that free quotes are just bad for the industry in general. The path forward is a challenge (changing
|
||||||
|
perception is hard). I don't know that I have answers on what the best path forward is, to be frank, but I do know that our current _status
|
||||||
|
quo_ is subpar to say the least.
|
||||||
|
|
||||||
|
Unfortunately, I don't think the change is going to come from the industry, but that it's going to require the consumer base to be more
|
||||||
|
educated and demand more from the industry. There have been many organizations that have dedicated years to changing the skill levels of
|
||||||
|
technicians in the industry, they are very well needed / don't mistake my words here, however unless a company has faced litigation or
|
||||||
|
facing requests on a regular basis that demand better results, then why would a company change!?!
|
||||||
|
|
||||||
|
I've been trying (unsuccessfully) to get rid of free quotes for 5+ years in my company. We try to educate customers during maintenance
|
||||||
|
visits and when scheduling equipment estimates, however only about 10-20% choose to go down our paid Home Performance Assessment path. Our
|
||||||
|
installation process does follow the QI Standard for the items that pertain to the setup / commissioning of the installed equipment, however
|
||||||
|
there is just no sustainable way for us to completely follow the items outlined in this article without charging for our time, because at
|
||||||
|
the end of the day we still have to be competitive in our market.
|
||||||
|
|
||||||
|
There are days that I can justify our actions to myself and also days that I just want to throw in the towel / not sacrifice our integrity.
|
||||||
|
Integrity is something that I take very seriously, after all our companies tag line is _"Since 1954, Integrity is in the Housh!"_
|
||||||
|
|
||||||
|
As mentioned, I'm not sure what the best path forward is! I hate to not have answers, but some problems are just complex and somewhat beyond
|
||||||
|
our control.
|
||||||
|
|
||||||
|
Let me know what you think some good solutions are.
|
||||||
|
|
||||||
|
- Does your company follow the QI Standard?
|
||||||
|
- What are resources that you've found helpful in educating your customers?
|
||||||
|
|
||||||
|
[^1]: DOE (2018)
|
||||||
@@ -7,8 +7,8 @@ summary: Build an example application using Vapor and HTMX.
|
|||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
This post is a quick example of creating a very basic todo web application using `Vapor` a swift web
|
This post is a quick example of creating a very basic todo web application using `Vapor` a swift web framework and `Htmx`, with no custom
|
||||||
framework and `Htmx`, with no custom javascript required.
|
javascript required.
|
||||||
|
|
||||||
[Vapor](https://docs.vapor.codes)
|
[Vapor](https://docs.vapor.codes)
|
||||||
|
|
||||||
@@ -30,9 +30,8 @@ Next, generate the project using the vapor command-line tool.
|
|||||||
vapor new todo-htmx --fluent.db sqlite --leaf
|
vapor new todo-htmx --fluent.db sqlite --leaf
|
||||||
```
|
```
|
||||||
|
|
||||||
The above command will generate a new project that uses an `SQLite` database along with vapor's
|
The above command will generate a new project that uses an `SQLite` database along with vapor's `Leaf` templating engine. You can move into
|
||||||
`Leaf` templating engine. You can move into the project directory and browse around the files that
|
the project directory and browse around the files that are generated.
|
||||||
are generated.
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd todo-htmx
|
cd todo-htmx
|
||||||
@@ -40,8 +39,8 @@ cd todo-htmx
|
|||||||
|
|
||||||
## Update the Controller
|
## Update the Controller
|
||||||
|
|
||||||
Open the `Sources/App/Controllers/TodoController.swift` file. This file handles the api routes for
|
Open the `Sources/App/Controllers/TodoController.swift` file. This file handles the api routes for our `Todo` database model. Personally I
|
||||||
our `Todo` database model. Personally I like to prefix these routes with `api`.
|
like to prefix these routes with `api`.
|
||||||
|
|
||||||
Update the first line in the `boot(routes: RoutesBuilder)` function to look like this.
|
Update the first line in the `boot(routes: RoutesBuilder)` function to look like this.
|
||||||
|
|
||||||
@@ -49,14 +48,13 @@ Update the first line in the `boot(routes: RoutesBuilder)` function to look like
|
|||||||
let todos = routes.grouped("api", "todos")
|
let todos = routes.grouped("api", "todos")
|
||||||
```
|
```
|
||||||
|
|
||||||
Everything else can stay the same. This changes these routes to be exposed at
|
Everything else can stay the same. This changes these routes to be exposed at `http://localhost:8080/api/todos`, which will allow our routes
|
||||||
`http://localhost:8080/api/todos`, which will allow our routes that return html views to be able to
|
that return html views to be able to be exposed at `http://localhost:8080/todos`.
|
||||||
be exposed at `http://localhost:8080/todos`.
|
|
||||||
|
|
||||||
## Update the Todo Model
|
## Update the Todo Model
|
||||||
|
|
||||||
A todo is not very valuable without a way to tell if it needs to be completed or not. So, let's add
|
A todo is not very valuable without a way to tell if it needs to be completed or not. So, let's add a field to our database model
|
||||||
a field to our database model (`Sources/App/Models/Todo.swift`).
|
(`Sources/App/Models/Todo.swift`).
|
||||||
|
|
||||||
Update the file to include the following:
|
Update the file to include the following:
|
||||||
|
|
||||||
@@ -97,8 +95,7 @@ final class Todo: Model, @unchecked Sendable {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Since we added a field to our database model, we also need to update the migration file
|
Since we added a field to our database model, we also need to update the migration file (`Sources/App/Migrations/CreateTodo.swift`).
|
||||||
(`Sources/App/Migrations/CreateTodo.swift`).
|
|
||||||
|
|
||||||
```swift
|
```swift
|
||||||
import Fluent
|
import Fluent
|
||||||
@@ -118,13 +115,12 @@ struct CreateTodo: AsyncMigration {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
This just adds our new field to the database schema when we run the migrations, which we will do
|
This just adds our new field to the database schema when we run the migrations, which we will do later on in the tutorial.
|
||||||
later on in the tutorial.
|
|
||||||
|
|
||||||
### Update the Data Transfer Object
|
### Update the Data Transfer Object
|
||||||
|
|
||||||
We also need to add the `complete` field to our data transfer object (`DTO`). This model is used as
|
We also need to add the `complete` field to our data transfer object (`DTO`). This model is used as an intermediate between our database and
|
||||||
an intermediate between our database and the user.
|
the user.
|
||||||
|
|
||||||
```swift
|
```swift
|
||||||
import Fluent
|
import Fluent
|
||||||
@@ -150,11 +146,9 @@ struct TodoDTO: Content {
|
|||||||
|
|
||||||
## Generate the View Templates
|
## Generate the View Templates
|
||||||
|
|
||||||
Our index template was already generated at `Resources/Views/index.leaf`, open the file and edit the
|
Our index template was already generated at `Resources/Views/index.leaf`, open the file and edit the contents to match the following.
|
||||||
contents to match the following.
|
|
||||||
|
|
||||||
> Note: You can learn more about the
|
> Note: You can learn more about the [leaf templating engine here.](https://docs.vapor.codes/leaf/getting-started/)
|
||||||
> [leaf templating engine here.](https://docs.vapor.codes/leaf/getting-started/)
|
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<!doctype html>
|
<!doctype html>
|
||||||
@@ -182,18 +176,15 @@ contents to match the following.
|
|||||||
</html>
|
</html>
|
||||||
```
|
```
|
||||||
|
|
||||||
The important parts here are the `<script>` tag in the head element which will include `Htmx` in our
|
The important parts here are the `<script>` tag in the head element which will include `Htmx` in our project.
|
||||||
project.
|
|
||||||
|
|
||||||
The head element also contains a link to a custom `css` stylesheet that we will create shortly.
|
The head element also contains a link to a custom `css` stylesheet that we will create shortly.
|
||||||
|
|
||||||
We add a `form` element that will be used to generate a new todo item in the database. This is a
|
We add a `form` element that will be used to generate a new todo item in the database. This is a basic / standard html form, but we are
|
||||||
basic / standard html form, but we are using `Htmx` to post the form contents to the route
|
using `Htmx` to post the form contents to the route `POST http://localhost:8080/todos`, which we will create shortly.
|
||||||
`POST http://localhost:8080/todos`, which we will create shortly.
|
|
||||||
|
|
||||||
Then there's the `table` element that will contain the contents of our todos. When the page is
|
Then there's the `table` element that will contain the contents of our todos. When the page is loaded it will use `Htmx` to fetch the todos
|
||||||
loaded it will use `Htmx` to fetch the todos from `GET http://localhost:8080/todos` route, which we
|
from `GET http://localhost:8080/todos` route, which we will create shortly.
|
||||||
will create shortly.
|
|
||||||
|
|
||||||
### Todos Table Template
|
### Todos Table Template
|
||||||
|
|
||||||
@@ -242,16 +233,14 @@ The contents of this file should be the following:
|
|||||||
</table>
|
</table>
|
||||||
```
|
```
|
||||||
|
|
||||||
Here, we just create a table that is 3 columns wide from a list of todos that we will pass in to the
|
Here, we just create a table that is 3 columns wide from a list of todos that we will pass in to the template. We use `Htmx` to handle
|
||||||
template. We use `Htmx` to handle updating a todo if a user clicks a checkbox to mark the todo as
|
updating a todo if a user clicks a checkbox to mark the todo as `complete`, we also add a button in the last column of the table that we use
|
||||||
`complete`, we also add a button in the last column of the table that we use `Htmx` to handle
|
`Htmx` to handle deleting a todo from the database.
|
||||||
deleting a todo from the database.
|
|
||||||
|
|
||||||
## Controllers
|
## Controllers
|
||||||
|
|
||||||
The controllers handle the routes that our website exposes. The project template creates a
|
The controllers handle the routes that our website exposes. The project template creates a controller for us that handles `JSON` / `API`
|
||||||
controller for us that handles `JSON` / `API` requests, but we do need to make a couple of changes
|
requests, but we do need to make a couple of changes to the file (`Sources/App/Controllers/TodoController.swift`).
|
||||||
to the file (`Sources/App/Controllers/TodoController.swift`).
|
|
||||||
|
|
||||||
```swift
|
```swift
|
||||||
import Fluent
|
import Fluent
|
||||||
@@ -306,19 +295,16 @@ struct TodoController: RouteCollection {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
The primary changes here are to add the `update(req: Request)` function at the bottom, which handles
|
The primary changes here are to add the `update(req: Request)` function at the bottom, which handles updating a todo that has already been
|
||||||
updating a todo that has already been created. This will be used when a user clicks on the checkbox
|
created. This will be used when a user clicks on the checkbox to mark a todo as complete or incomplete.
|
||||||
to mark a todo as complete or incomplete.
|
|
||||||
|
|
||||||
We also change the route in the `boot(routes: RoutesBuilder)` method to make all these routes
|
We also change the route in the `boot(routes: RoutesBuilder)` method to make all these routes accessible at `/api/todos` instead of the
|
||||||
accessible at `/api/todos` instead of the original `/todos` as we will use the `/todos` routes for
|
original `/todos` as we will use the `/todos` routes for returning our views from our view controller.
|
||||||
returning our views from our view controller.
|
|
||||||
|
|
||||||
### Todo View Controller
|
### Todo View Controller
|
||||||
|
|
||||||
Next we need to create our view controller, it is what will be used to handle routes that should
|
Next we need to create our view controller, it is what will be used to handle routes that should return `html` content for our website. This
|
||||||
return `html` content for our website. This controller will actually use the api controller to do
|
controller will actually use the api controller to do the majority of it's work.
|
||||||
the majority of it's work.
|
|
||||||
|
|
||||||
The easiest thing is to make a copy of the current api controller:
|
The easiest thing is to make a copy of the current api controller:
|
||||||
|
|
||||||
@@ -373,9 +359,8 @@ struct TodoViewController: RouteCollection {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Here we use the api controller to do the heavy lifting of communicating with the database, then we
|
Here we use the api controller to do the heavy lifting of communicating with the database, then we just always return / render the
|
||||||
just always return / render the `todos.leaf` template that we created earlier, which will update our
|
`todos.leaf` template that we created earlier, which will update our web page with the list of todos retreived from the database.
|
||||||
web page with the list of todos retreived from the database.
|
|
||||||
|
|
||||||
> Note: There are better ways to handle this, however this is just a simple example.
|
> Note: There are better ways to handle this, however this is just a simple example.
|
||||||
|
|
||||||
@@ -401,8 +386,8 @@ func routes(_ app: Application) throws {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Here, we just add the `TodoViewController` at the bottom so vapor will be able to handle those
|
Here, we just add the `TodoViewController` at the bottom so vapor will be able to handle those routes and also update the title to be
|
||||||
routes and also update the title to be `Todos` (in the first `app.get` near the top).
|
`Todos` (in the first `app.get` near the top).
|
||||||
|
|
||||||
## Build and Run
|
## Build and Run
|
||||||
|
|
||||||
@@ -414,8 +399,8 @@ First, let's make sure the project builds.
|
|||||||
swift build
|
swift build
|
||||||
```
|
```
|
||||||
|
|
||||||
This may take a minute if it's the first time building the project as it has to fetch the
|
This may take a minute if it's the first time building the project as it has to fetch the dependencies. If you experience problems here then
|
||||||
dependencies. If you experience problems here then make sure you don't have typos in your files.
|
make sure you don't have typos in your files.
|
||||||
|
|
||||||
Next, we need to run the database migrations.
|
Next, we need to run the database migrations.
|
||||||
|
|
||||||
@@ -429,15 +414,15 @@ Finally, we can run the application.
|
|||||||
swift run App
|
swift run App
|
||||||
```
|
```
|
||||||
|
|
||||||
You should be able to open your browser and type in the url: `http://localhost:8080` to view the
|
You should be able to open your browser and type in the url: `http://localhost:8080` to view the application. You can experiment with adding
|
||||||
application. You can experiment with adding a new todo using the form.
|
a new todo using the form.
|
||||||
|
|
||||||
> Note: To stop the application use `Ctrl-c`
|
> Note: To stop the application use `Ctrl-c`
|
||||||
|
|
||||||
## Bonus Styles
|
## Bonus Styles
|
||||||
|
|
||||||
Hopefully you weren't blinded the first time you opened the application. You can add custom styles
|
Hopefully you weren't blinded the first time you opened the application. You can add custom styles by creating a `css` file
|
||||||
by creating a `css` file (`Public/css/main.css`).
|
(`Public/css/main.css`).
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mkdir Public/css
|
mkdir Public/css
|
||||||
@@ -476,8 +461,8 @@ td {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Currently vapor does not know to serve files from the `Public` directory, so we need to update the
|
Currently vapor does not know to serve files from the `Public` directory, so we need to update the `Sources/App/configure.swift` file, by
|
||||||
`Sources/App/configure.swift` file, by uncommenting the line near the top.
|
uncommenting the line near the top.
|
||||||
|
|
||||||
```swift
|
```swift
|
||||||
import Fluent
|
import Fluent
|
||||||
|
|||||||
BIN
content/articles/images/2023-08-10-coil-bypass-overview.png
LFS
Normal file
BIN
content/articles/images/2023-08-10-coil-bypass-overview.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-08-10-register-throw.png
LFS
Normal file
BIN
content/articles/images/2023-08-10-register-throw.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-08-10-rss-feed.gif
LFS
Normal file
BIN
content/articles/images/2023-08-10-rss-feed.gif
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-08-10-volume-equation.png
LFS
Normal file
BIN
content/articles/images/2023-08-10-volume-equation.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-08-formula.png
LFS
Normal file
BIN
content/articles/images/2023-09-08-formula.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-08-pounds-of-water-removed.png
LFS
Normal file
BIN
content/articles/images/2023-09-08-pounds-of-water-removed.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-08-solution.png
LFS
Normal file
BIN
content/articles/images/2023-09-08-solution.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-14-why-mini-splits-stink.png
LFS
Normal file
BIN
content/articles/images/2023-09-14-why-mini-splits-stink.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-15-pints-per-day-example.png
LFS
Normal file
BIN
content/articles/images/2023-09-15-pints-per-day-example.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-15-pints-per-day-example2.png
LFS
Normal file
BIN
content/articles/images/2023-09-15-pints-per-day-example2.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-15-pints-per-day.png
LFS
Normal file
BIN
content/articles/images/2023-09-15-pints-per-day.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-15-sizing-dehumidifier-by-latent-load.png
LFS
Normal file
BIN
content/articles/images/2023-09-15-sizing-dehumidifier-by-latent-load.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-18-dh-size.png
LFS
Normal file
BIN
content/articles/images/2023-09-18-dh-size.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-18-help.png
LFS
Normal file
BIN
content/articles/images/2023-09-18-help.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-18-introducing-psychrometrics-cli.png
LFS
Normal file
BIN
content/articles/images/2023-09-18-introducing-psychrometrics-cli.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-18-pounds-removed.png
LFS
Normal file
BIN
content/articles/images/2023-09-18-pounds-removed.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-18-properties.png
LFS
Normal file
BIN
content/articles/images/2023-09-18-properties.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-21-introduction-to-programming-for-hvac-1.png
LFS
Normal file
BIN
content/articles/images/2023-09-21-introduction-to-programming-for-hvac-1.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-21-spotlight.png
LFS
Normal file
BIN
content/articles/images/2023-09-21-spotlight.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-21-terminal-line.png
LFS
Normal file
BIN
content/articles/images/2023-09-21-terminal-line.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-21-terminal.png
LFS
Normal file
BIN
content/articles/images/2023-09-21-terminal.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-22-brew-output.png
LFS
Normal file
BIN
content/articles/images/2023-09-22-brew-output.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-22-introduction-to-programming-for-hvac-2.png
LFS
Normal file
BIN
content/articles/images/2023-09-22-introduction-to-programming-for-hvac-2.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-24-hello-output.png
LFS
Normal file
BIN
content/articles/images/2023-09-24-hello-output.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-24-introduction-to-programming-for-hvac-3.png
LFS
Normal file
BIN
content/articles/images/2023-09-24-introduction-to-programming-for-hvac-3.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-24-text-settings.png
LFS
Normal file
BIN
content/articles/images/2023-09-24-text-settings.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-26-greet-output.png
LFS
Normal file
BIN
content/articles/images/2023-09-26-greet-output.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-26-introduction-to-programming-for-hvac-4.png
LFS
Normal file
BIN
content/articles/images/2023-09-26-introduction-to-programming-for-hvac-4.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-09-26-part4-banner-transparent.png
LFS
Normal file
BIN
content/articles/images/2023-09-26-part4-banner-transparent.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-10-04-free-quotes-are-bad-for-the-industry.png
LFS
Normal file
BIN
content/articles/images/2023-10-04-free-quotes-are-bad-for-the-industry.png
LFS
Normal file
Binary file not shown.
BIN
content/articles/images/2023-10-04-sinking-boat.png
LFS
Normal file
BIN
content/articles/images/2023-10-04-sinking-boat.png
LFS
Normal file
Binary file not shown.
@@ -1,16 +1,15 @@
|
|||||||
/* PrismJS 1.23.0
|
/* PrismJS 1.29.0
|
||||||
https://prismjs.com/download.html#themes=prism&languages=css+clike+javascript+c+objectivec+python+swift */
|
https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+swift */
|
||||||
/**
|
/**
|
||||||
* prism.js default theme for JavaScript, CSS and HTML
|
* prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML
|
||||||
* Based on dabblet (http://dabblet.com)
|
* Based on https://github.com/chriskempson/tomorrow-theme
|
||||||
* @author Lea Verou
|
* @author Rose Pritchard
|
||||||
*/
|
*/
|
||||||
|
|
||||||
code[class*="language-"],
|
code[class*="language-"],
|
||||||
pre[class*="language-"] {
|
pre[class*="language-"] {
|
||||||
color: black;
|
color: #ccc;
|
||||||
background: none;
|
background: none;
|
||||||
text-shadow: 0 1px white;
|
|
||||||
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
@@ -28,25 +27,7 @@ pre[class*="language-"] {
|
|||||||
-moz-hyphens: none;
|
-moz-hyphens: none;
|
||||||
-ms-hyphens: none;
|
-ms-hyphens: none;
|
||||||
hyphens: none;
|
hyphens: none;
|
||||||
}
|
|
||||||
|
|
||||||
pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
|
|
||||||
code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
|
|
||||||
text-shadow: none;
|
|
||||||
background: #b3d4fc;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
|
|
||||||
code[class*="language-"]::selection, code[class*="language-"] ::selection {
|
|
||||||
text-shadow: none;
|
|
||||||
background: #b3d4fc;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media print {
|
|
||||||
code[class*="language-"],
|
|
||||||
pre[class*="language-"] {
|
|
||||||
text-shadow: none;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Code blocks */
|
/* Code blocks */
|
||||||
@@ -58,7 +39,7 @@ pre[class*="language-"] {
|
|||||||
|
|
||||||
:not(pre) > code[class*="language-"],
|
:not(pre) > code[class*="language-"],
|
||||||
pre[class*="language-"] {
|
pre[class*="language-"] {
|
||||||
background: #f5f2f0;
|
background: #2d2d2d;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Inline code */
|
/* Inline code */
|
||||||
@@ -69,64 +50,61 @@ pre[class*="language-"] {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.token.comment,
|
.token.comment,
|
||||||
|
.token.block-comment,
|
||||||
.token.prolog,
|
.token.prolog,
|
||||||
.token.doctype,
|
.token.doctype,
|
||||||
.token.cdata {
|
.token.cdata {
|
||||||
color: slategray;
|
|
||||||
}
|
|
||||||
|
|
||||||
.token.punctuation {
|
|
||||||
color: #999;
|
color: #999;
|
||||||
}
|
}
|
||||||
|
|
||||||
.token.namespace {
|
.token.punctuation {
|
||||||
opacity: .7;
|
color: #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.tag,
|
||||||
|
.token.attr-name,
|
||||||
|
.token.namespace,
|
||||||
|
.token.deleted {
|
||||||
|
color: #e2777a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.function-name {
|
||||||
|
color: #6196cc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.boolean,
|
||||||
|
.token.number,
|
||||||
|
.token.function {
|
||||||
|
color: #f08d49;
|
||||||
}
|
}
|
||||||
|
|
||||||
.token.property,
|
.token.property,
|
||||||
.token.tag,
|
.token.class-name,
|
||||||
.token.boolean,
|
|
||||||
.token.number,
|
|
||||||
.token.constant,
|
.token.constant,
|
||||||
.token.symbol,
|
.token.symbol {
|
||||||
.token.deleted {
|
color: #f8c555;
|
||||||
color: #905;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.token.selector,
|
.token.selector,
|
||||||
.token.attr-name,
|
.token.important,
|
||||||
|
.token.atrule,
|
||||||
|
.token.keyword,
|
||||||
|
.token.builtin {
|
||||||
|
color: #cc99cd;
|
||||||
|
}
|
||||||
|
|
||||||
.token.string,
|
.token.string,
|
||||||
.token.char,
|
.token.char,
|
||||||
.token.builtin,
|
.token.attr-value,
|
||||||
.token.inserted {
|
.token.regex,
|
||||||
color: #690;
|
.token.variable {
|
||||||
|
color: #7ec699;
|
||||||
}
|
}
|
||||||
|
|
||||||
.token.operator,
|
.token.operator,
|
||||||
.token.entity,
|
.token.entity,
|
||||||
.token.url,
|
.token.url {
|
||||||
.language-css .token.string,
|
color: #67cdcc;
|
||||||
.style .token.string {
|
|
||||||
color: #9a6e3a;
|
|
||||||
/* This background color was intended by the author of this theme. */
|
|
||||||
background: hsla(0, 0%, 100%, .5);
|
|
||||||
}
|
|
||||||
|
|
||||||
.token.atrule,
|
|
||||||
.token.attr-value,
|
|
||||||
.token.keyword {
|
|
||||||
color: #07a;
|
|
||||||
}
|
|
||||||
|
|
||||||
.token.function,
|
|
||||||
.token.class-name {
|
|
||||||
color: #DD4A68;
|
|
||||||
}
|
|
||||||
|
|
||||||
.token.regex,
|
|
||||||
.token.important,
|
|
||||||
.token.variable {
|
|
||||||
color: #e90;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.token.important,
|
.token.important,
|
||||||
@@ -140,3 +118,7 @@ pre[class*="language-"] {
|
|||||||
.token.entity {
|
.token.entity {
|
||||||
cursor: help;
|
cursor: help;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.token.inserted {
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
|||||||
109
deploy/404.html
Normal file
109
deploy/404.html
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<meta content="#0e1112" media="(prefers-color-scheme: dark)" name="theme-color"/>
|
||||||
|
<meta content="#566B78" media="(prefers-color-scheme: light)" name="theme-color"/>
|
||||||
|
<meta content="Michael Housh" name="author"/>
|
||||||
|
<meta content="Mhoush" name="apple-mobile-web-app-title"/>
|
||||||
|
<meta content="initial-scale=1.0, width=device-width" name="viewport"/>
|
||||||
|
<meta content="telephone=no" name="format-detection"/>
|
||||||
|
<meta content="True" name="HandheldFriendly"/>
|
||||||
|
<meta content="320" name="MobileOptimized"/>
|
||||||
|
<meta content="Mhoush" name="og:site_name"/>
|
||||||
|
<meta content="hvac, developer, swift, home-performance, design" name="keywords"/>
|
||||||
|
<title>
|
||||||
|
mhoush: 404
|
||||||
|
</title>
|
||||||
|
<link href="/static/favicon.ico" rel="shortcut icon"/>
|
||||||
|
<link href="/static/output.css" rel="stylesheet"/>
|
||||||
|
<link href="/static/style.css" rel="stylesheet"/>
|
||||||
|
<link href="/articles/feed.xml" rel="alternate" title="mhoush" type="application/rss+xml"/>
|
||||||
|
</head>
|
||||||
|
<body class="bg-page text-white pb-5 font-avenir notFound">
|
||||||
|
<header class="bg-nav text-gray py-4 text-base/6 lg:fixed w-full lg:h-[62px]">
|
||||||
|
<nav class="container flex gap-x-5 lg:gap-x-y items-center">
|
||||||
|
<ul class="flex flex-wrap gap-x-2 lg:gap-x-5">
|
||||||
|
<li>
|
||||||
|
<a class href="/">Home</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class href="/articles/">Articles</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class href="/about/">About</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<div class="container pt-12 lg:pt-28">
|
||||||
|
<article class="prose">
|
||||||
|
<h2>Oops!</h2>
|
||||||
|
<p>Your page was not found.</p>
|
||||||
|
<p>Looking for one of the articles?</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="/articles/2025/vapor-htmx-todo-app/">Vapor + HTMX</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/articles/2024/free-as-in-freedom/">Free As In Freedom</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/articles/2024/pgp-encryption-introduction/">PGP Encryption Introduction</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/articles/2024/unvr-as-nas/">UNVR as NAS</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/articles/2024/elevating-hvac/">Elevating HVAC: A Skilled Trade Beyond Labor</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/articles/2023/most-important-job/">Most Important Job</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/articles/2023/cancel-this/">Cancel This</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/articles/2023/hope/">Hope</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/articles/2023/heat-recovery-chiller/">Heat Recovery Chiller</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/articles/2023/you-should-learn-markdown/">You Should Learn Markdown</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div>
|
||||||
|
<a href="/articles/">› See all articles</a>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
<div class="site-footer container text-gray gray-links border-t border-light text-center pt-6 mt-8 text-sm">
|
||||||
|
<p>
|
||||||
|
Copyright © Michael Housh 2023-2025.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Built in Swift using
|
||||||
|
<a href="https://github.com/loopwerk/Saga" rel="nofollow" target="_blank">Saga</a>
|
||||||
|
(<a href="https://github.com/m-housh/mhoush.com" rel="nofollow" target="_blank">source</a>).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a href="http://localhost:3000/articles/feed.xml" rel="nofollow" target="_blank">RSS</a>
|
||||||
|
|
|
||||||
|
<a href="https://github.com/m-housh" rel="nofollow" target="_blank">Github</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.youtube.com/channel/UCb58SeURd5bObfTiL0KoliA" rel="nofollow" target="_blank">Youtube</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.facebook.com/michael.housh" rel="nofollow" target="_blank">Facebook</a>
|
||||||
|
|
|
||||||
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -83,6 +83,12 @@ HVAC Overtime
|
|||||||
|
|
|
|
||||||
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
</p>
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -66,36 +66,36 @@ refrigerant charge losses. It should be noted that this is not true for..." name
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2023-09-19-calculate-seer-degradation-by-age.png"/>
|
<img alt="banner" src="http://localhost:3000/articles/images/2023-09-19-calculate-seer-degradation-by-age.png"/>
|
||||||
<p>This is a quick tech-tip to learn how to calculate the degradation of SEER based<br />
|
<p>This is a quick tech-tip to learn how to calculate the degradation of SEER based
|
||||||
on age.</p>
|
on age.</p>
|
||||||
<p>The degradation of SEER is due to fouling of the evaporator coil with dirt and<br />
|
<p>The degradation of SEER is due to fouling of the evaporator coil with dirt and
|
||||||
refrigerant charge losses. It should be noted that this is not true for all<br />
|
refrigerant charge losses. It should be noted that this is not true for all
|
||||||
applications, but is used as an estimation based on research done by the <code>DOE</code><br />
|
applications, but is used as an estimation based on research done by the <code>DOE</code>
|
||||||
of the average degradation based on systems tested.</p>
|
of the average degradation based on systems tested.</p>
|
||||||
<h2>Formula</h2>
|
<h2>Formula</h2>
|
||||||
<p>This is the formula used to calculate the SEER based on age of the evaporator<br />
|
<p>This is the formula used to calculate the SEER based on age of the evaporator
|
||||||
coil / air handler.</p>
|
coil / air handler.</p>
|
||||||
<p>$$ SEER_d = SEER_n \times (1 - M)^{age} $$</p>
|
<p>$$ SEER_d = SEER_n \times (1 - M)^{age} $$</p>
|
||||||
<p>| Where | |<br />
|
<p>| Where | |
|
||||||
| –––– | —————————————— | — |<br />
|
| –––– | —————————————— | — |
|
||||||
| $SEER_d$ | Degradated SEER rating |<br />
|
| $SEER_d$ | Degradated SEER rating |
|
||||||
| $SEER_n$ | Nominal SEER rating when equipment was new | |<br />
|
| $SEER_n$ | Nominal SEER rating when equipment was new | |
|
||||||
| M | Maintenance factor, 0.01-0.03 |<br />
|
| M | Maintenance factor, 0.01-0.03 |
|
||||||
| age | The age of the equipment, in years |</p>
|
| age | The age of the equipment, in years |</p>
|
||||||
<p>The maintenance factor of 0.01 is for expertly maintained equipment and 0.03 is<br />
|
<p>The maintenance factor of 0.01 is for expertly maintained equipment and 0.03 is
|
||||||
for unmaintained. The maintenance factor in essence is based on 1%-3%<br />
|
for unmaintained. The maintenance factor in essence is based on 1%-3%
|
||||||
degradation per year, however there are some<br />
|
degradation per year, however there are some
|
||||||
<a href="https://publications.energyresearch.ucf.edu/wp-content/uploads/2018/09/FSEC-PF-474-18.pdf">studies</a><br />
|
<a href="https://publications.energyresearch.ucf.edu/wp-content/uploads/2018/09/FSEC-PF-474-18.pdf">studies</a>
|
||||||
that show that this can actually be as high as 5% or above depending on climate.<br />
|
that show that this can actually be as high as 5% or above depending on climate.
|
||||||
We could use up to 0.05 as the maintenance factor, just to see what the “range”<br />
|
We could use up to 0.05 as the maintenance factor, just to see what the “range”
|
||||||
of degradation would be.</p>
|
of degradation would be.</p>
|
||||||
<p>Interestingly, the study linked also shows that the degradation is higher the<br />
|
<p>Interestingly, the study linked also shows that the degradation is higher the
|
||||||
higher the tonnage of the equipment. It also shows that the degradation is lower<br />
|
higher the tonnage of the equipment. It also shows that the degradation is lower
|
||||||
per year the higher the nominal SEER rating of the system (which is corelated to<br />
|
per year the higher the nominal SEER rating of the system (which is corelated to
|
||||||
using TXV’s and lower airflow rates because of the equipment having multiple<br />
|
using TXV’s and lower airflow rates because of the equipment having multiple
|
||||||
stages).</p>
|
stages).</p>
|
||||||
<h2>Example</h2>
|
<h2>Example</h2>
|
||||||
<p>Let’s consider that we have a 13 SEER piece of equipment that was matched when<br />
|
<p>Let’s consider that we have a 13 SEER piece of equipment that was matched when
|
||||||
installed and the system is 15 years old.</p>
|
installed and the system is 15 years old.</p>
|
||||||
<p>Plugging those numbers into our formula.</p>
|
<p>Plugging those numbers into our formula.</p>
|
||||||
<hr />
|
<hr />
|
||||||
@@ -105,8 +105,8 @@ installed and the system is 15 years old.</p>
|
|||||||
<h4>Highest Rage (5% degradation / year)</h4>
|
<h4>Highest Rage (5% degradation / year)</h4>
|
||||||
<p>$$ SEER_d = 13 \times (1 - 0.05)^{15} = 6 $$</p>
|
<p>$$ SEER_d = 13 \times (1 - 0.05)^{15} = 6 $$</p>
|
||||||
<hr />
|
<hr />
|
||||||
<p>An expertly maintained system may not have degraded that much, with an 11.2 SEER<br />
|
<p>An expertly maintained system may not have degraded that much, with an 11.2 SEER
|
||||||
vs. a poorly maintained / dirty system that also suffers from refrigerant charge<br />
|
vs. a poorly maintained / dirty system that also suffers from refrigerant charge
|
||||||
losses can be as low as 6 SEER.</p>
|
losses can be as low as 6 SEER.</p>
|
||||||
<p>Thanks for learning how to estimate SEER degradation based on equipment age!</p>
|
<p>Thanks for learning how to estimate SEER degradation based on equipment age!</p>
|
||||||
</article>
|
</article>
|
||||||
@@ -143,7 +143,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2025-01-05-vapor-htmx-todo-app.png"/>
|
|
||||||
Build an example application using Vapor and HTMX.
|
Build an example application using Vapor and HTMX.
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -157,7 +156,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2024/free-as-in-freedom/"><div>
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2024-04-09-free-as-in-freedom.png"/>
|
|
||||||
Salute to open-source software engineers
|
Salute to open-source software engineers
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -188,6 +186,12 @@ Programming, Home-Performance, and Building Science
|
|||||||
|
|
|
|
||||||
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
</p>
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -64,52 +64,52 @@ online interactions is tone and other subtleties..." name="og:description"/>
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2023-12-12-cancel-this.gif"/>
|
<img alt="banner" src="http://localhost:3000/articles/images/2023-12-12-cancel-this.gif"/>
|
||||||
<p>This post is going to be hard to put into words, it’s going to seem egotistical at points, but know<br />
|
<p>This post is going to be hard to put into words, it’s going to seem egotistical at points, but know
|
||||||
that my actions / feelings online are the same as they are if you met me in person. The problem with<br />
|
that my actions / feelings online are the same as they are if you met me in person. The problem with
|
||||||
online interactions is tone and other subtleties do not come across, so it’s hard to tell when<br />
|
online interactions is tone and other subtleties do not come across, so it’s hard to tell when
|
||||||
someone is joking or being serious.</p>
|
someone is joking or being serious.</p>
|
||||||
<h2>The Meat</h2>
|
<h2>The Meat</h2>
|
||||||
<p>It has been brought to my attention that someone out there thinks that I’m sexist and should not<br />
|
<p>It has been brought to my attention that someone out there thinks that I’m sexist and should not
|
||||||
speak at the HVAC School symposium because of it. They are holding a curse word against me that I<br />
|
speak at the HVAC School symposium because of it. They are holding a curse word against me that I
|
||||||
said two years ago, in the moment A) it was fitting and B) it was one of those times that my mouth<br />
|
said two years ago, in the moment A) it was fitting and B) it was one of those times that my mouth
|
||||||
was working faster than my brain (raise your hand if that’s ever happened to you).</p>
|
was working faster than my brain (raise your hand if that’s ever happened to you).</p>
|
||||||
<p>I am an open book, I am not afraid of showing failures and strengths. I’ve never claimed to be<br />
|
<p>I am an open book, I am not afraid of showing failures and strengths. I’ve never claimed to be
|
||||||
perfect (well, actually I have but it’s always a joke). I’m not at all condoning what I’ve said in<br />
|
perfect (well, actually I have but it’s always a joke). I’m not at all condoning what I’ve said in
|
||||||
the past, nor will I repeat it out of context now, but I communicate with people like adults and I<br />
|
the past, nor will I repeat it out of context now, but I communicate with people like adults and I
|
||||||
look at people as piers. We do not always have to agree with one another, conflict helps us learn<br />
|
look at people as piers. We do not always have to agree with one another, conflict helps us learn
|
||||||
where to grow, but we also can not expect people to change to fit our wants / needs, that’s just not<br />
|
where to grow, but we also can not expect people to change to fit our wants / needs, that’s just not
|
||||||
how it works.</p>
|
how it works.</p>
|
||||||
<p>I do not at all agree with the tactics used by whomever is behind this. I would happily discuss this<br />
|
<p>I do not at all agree with the tactics used by whomever is behind this. I would happily discuss this
|
||||||
in private or out in the open. You can find all my contact / social information in the sidebar of<br />
|
in private or out in the open. You can find all my contact / social information in the sidebar of
|
||||||
this website and I’ve offered up my cell phone number in private groups that we are all probably a<br />
|
this website and I’ve offered up my cell phone number in private groups that we are all probably a
|
||||||
part of.</p>
|
part of.</p>
|
||||||
<h2>The Potatoes</h2>
|
<h2>The Potatoes</h2>
|
||||||
<p>I am a father of 3 girls, I have a sister, talk crap about my mom and you’ll find out who I am! I<br />
|
<p>I am a father of 3 girls, I have a sister, talk crap about my mom and you’ll find out who I am! I
|
||||||
love women, I have no problem with women in the trades, I encourage women who are in the trades. I<br />
|
love women, I have no problem with women in the trades, I encourage women who are in the trades. I
|
||||||
try to help every person that I can, if I can. I have failed more times than you can imagine! I am<br />
|
try to help every person that I can, if I can. I have failed more times than you can imagine! I am
|
||||||
self taught in about everything I do, so I give of it freely. I have all kinds of work to do to grow<br />
|
self taught in about everything I do, so I give of it freely. I have all kinds of work to do to grow
|
||||||
into the man that I should be, but at the same time, I am not afraid to be the man that I am today.<br />
|
into the man that I should be, but at the same time, I am not afraid to be the man that I am today.
|
||||||
I will greet you by whatever pronoun you want to be referred as.</p>
|
I will greet you by whatever pronoun you want to be referred as.</p>
|
||||||
<p>I would love to say that I don’t judge people, but I do, just as I’m being judged! I am fine with<br />
|
<p>I would love to say that I don’t judge people, but I do, just as I’m being judged! I am fine with
|
||||||
someone judging me and having opinions about me, I mean that is our right. I will not say that<br />
|
someone judging me and having opinions about me, I mean that is our right. I will not say that
|
||||||
person is wrong, because in their mind they’re right. What I will not do is stop being myself. I<br />
|
person is wrong, because in their mind they’re right. What I will not do is stop being myself. I
|
||||||
know for a fact that I’ve helped more people than this person has gotten “cancelled”. I will<br />
|
know for a fact that I’ve helped more people than this person has gotten “cancelled”. I will
|
||||||
continue to help people in the trades, homeowners, or people in need. I also will not remain quiet!<br />
|
continue to help people in the trades, homeowners, or people in need. I also will not remain quiet!
|
||||||
I will give my opinion like it or not. There are people in my corner that really know me and my<br />
|
I will give my opinion like it or not. There are people in my corner that really know me and my
|
||||||
intentions.</p>
|
intentions.</p>
|
||||||
<h2>Final Words</h2>
|
<h2>Final Words</h2>
|
||||||
<p>The trades are rough around the edges, just as am I. The trades are a slow turning ship (just look<br />
|
<p>The trades are rough around the edges, just as am I. The trades are a slow turning ship (just look
|
||||||
at how many still do not follow proper practices, etc. even with the capabilities and resources<br />
|
at how many still do not follow proper practices, etc. even with the capabilities and resources
|
||||||
available today).</p>
|
available today).</p>
|
||||||
<p>If you are new / coming into the trades then I hope you are not overly sensitive to foul language<br />
|
<p>If you are new / coming into the trades then I hope you are not overly sensitive to foul language
|
||||||
and other inappropriate comments. Thick skin is valuable in the trades, but at the same time don’t<br />
|
and other inappropriate comments. Thick skin is valuable in the trades, but at the same time don’t
|
||||||
be afraid to speak up if something offends you. Remember we are adults, we can handle disagreements<br />
|
be afraid to speak up if something offends you. Remember we are adults, we can handle disagreements
|
||||||
like adults (well, some of us can). Adults can learn from those of any age, they can reflect on<br />
|
like adults (well, some of us can). Adults can learn from those of any age, they can reflect on
|
||||||
their own behavior and make their own decisions.</p>
|
their own behavior and make their own decisions.</p>
|
||||||
<p>I personally think that being offended is not a bad thing, it causes us to reflect / repair our<br />
|
<p>I personally think that being offended is not a bad thing, it causes us to reflect / repair our
|
||||||
foundational beliefs. I hope that we can stop with this “cancel culture” of today, stop hiding<br />
|
foundational beliefs. I hope that we can stop with this “cancel culture” of today, stop hiding
|
||||||
behind a keyboard, and be a diverse community.</p>
|
behind a keyboard, and be a diverse community.</p>
|
||||||
<p>To wrap things up, I just want to reiterate that I am not at all mad at whomever is behind this. To<br />
|
<p>To wrap things up, I just want to reiterate that I am not at all mad at whomever is behind this. To
|
||||||
everyone out there who has shown me love and support, I greatly appreciate it.</p>
|
everyone out there who has shown me love and support, I greatly appreciate it.</p>
|
||||||
</article>
|
</article>
|
||||||
<div class="border-t border-light mt-8 pt-8">
|
<div class="border-t border-light mt-8 pt-8">
|
||||||
@@ -145,7 +145,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2025-01-05-vapor-htmx-todo-app.png"/>
|
|
||||||
Build an example application using Vapor and HTMX.
|
Build an example application using Vapor and HTMX.
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -159,7 +158,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2024/free-as-in-freedom/"><div>
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2024-04-09-free-as-in-freedom.png"/>
|
|
||||||
Salute to open-source software engineers
|
Salute to open-source software engineers
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -190,6 +188,12 @@ Programming, Home-Performance, and Building Science
|
|||||||
|
|
|
|
||||||
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
</p>
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
266
deploy/articles/2023/coil-bypass-overview/index.html
Normal file
266
deploy/articles/2023/coil-bypass-overview/index.html
Normal file
@@ -0,0 +1,266 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<meta content="#0e1112" media="(prefers-color-scheme: dark)" name="theme-color"/>
|
||||||
|
<meta content="#566B78" media="(prefers-color-scheme: light)" name="theme-color"/>
|
||||||
|
<meta content="Michael Housh" name="author"/>
|
||||||
|
<meta content="Mhoush" name="apple-mobile-web-app-title"/>
|
||||||
|
<meta content="initial-scale=1.0, width=device-width" name="viewport"/>
|
||||||
|
<meta content="telephone=no" name="format-detection"/>
|
||||||
|
<meta content="True" name="HandheldFriendly"/>
|
||||||
|
<meta content="320" name="MobileOptimized"/>
|
||||||
|
<meta content="Mhoush" name="og:site_name"/>
|
||||||
|
<meta content="hvac, developer, swift, home-performance, design" name="keywords"/>
|
||||||
|
<title>
|
||||||
|
mhoush: Coil Bypass Overview
|
||||||
|
</title>
|
||||||
|
<link href="/static/favicon.ico" rel="shortcut icon"/>
|
||||||
|
<link href="/static/output.css" rel="stylesheet"/>
|
||||||
|
<link href="/static/style.css" rel="stylesheet"/>
|
||||||
|
<link href="/articles/feed.xml" rel="alternate" title="mhoush" type="application/rss+xml"/>
|
||||||
|
<link href="/static/prism.css" rel="stylesheet"/>
|
||||||
|
<meta content="This is the first article in a series that explores the idea of a coil bypass strategy in an HVAC system. This article introduces you to a
|
||||||
|
coil bypass strategy at a high level, future posts will dive deeper into the features, benefits, as well as the..." name="description"/>
|
||||||
|
<meta content="summary_large_image" name="twitter:card"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-08-10-coil-bypass-overview.png" name="twitter:image"/>
|
||||||
|
<meta content="Coil Bypass Overview" name="twitter:image:alt"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images//articles/2023/coil-bypass-overview/" name="og:url"/>
|
||||||
|
<meta content="Coil Bypass Overview" name="og:title"/>
|
||||||
|
<meta content="This is the first article in a series that explores the idea of a coil bypass strategy in an HVAC system. This article introduces you to a
|
||||||
|
coil bypass strategy at a high level, future posts will dive deeper into the features, benefits, as well as the..." name="og:description"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-08-10-coil-bypass-overview.png" name="og:image"/>
|
||||||
|
<meta content="1014" name="og:image:width"/>
|
||||||
|
<meta content="530" name="og:image:height"/>
|
||||||
|
<script crossorigin="anonymous" src="https://kit.fontawesome.com/f209982030.js">
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body class="bg-page text-white pb-5 font-avenir articles">
|
||||||
|
<header class="bg-nav text-gray py-4 text-base/6 lg:fixed w-full lg:h-[62px]">
|
||||||
|
<nav class="container flex gap-x-5 lg:gap-x-y items-center">
|
||||||
|
<ul class="flex flex-wrap gap-x-2 lg:gap-x-5">
|
||||||
|
<li>
|
||||||
|
<a class href="/">Home</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="active" href="/articles/">Articles</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class href="/about/">About</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<div class="container pt-12 lg:pt-28">
|
||||||
|
<article class="prose">
|
||||||
|
<h1>
|
||||||
|
Coil Bypass Overview
|
||||||
|
</h1>
|
||||||
|
<div class="-mt-6">
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">August 10, 2023</span>1010 words, posted in <a href="/articles/tag/hvac/">HVAC</a> and <a href="/articles/tag/design/">design</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<img alt="banner" src="http://localhost:3000/articles/images/2023-08-10-coil-bypass-overview.png"/>
|
||||||
|
<p>This is the first article in a series that explores the idea of a coil bypass strategy in an HVAC system. This article introduces you to a
|
||||||
|
coil bypass strategy at a high level, future posts will dive deeper into the features, benefits, as well as the challenges of this style of
|
||||||
|
system.</p>
|
||||||
|
<h2>What is a Coil Bypass</h2>
|
||||||
|
<p>A coil bypass is not to be mistaken for a zoning system bypass, where airflow is “relieved” from the supply side of the system back into the
|
||||||
|
return. Instead, a coil bypass diverts a portion of the airflow around the coil using a bypass damper(s). The bypass can serve several
|
||||||
|
functions depending on the application, but in general it allows for a constant volume of air to be delivered to the space while the output
|
||||||
|
of the coil can be shifted towards more or less dehumidification. In other words, it decouples the total system airflow from the coil
|
||||||
|
airflow.</p>
|
||||||
|
<p>The bypassed air mixes with the supply air stream to act as a reheat source, however unlike a typical reheat source it does not add more
|
||||||
|
sensible load to the structure, instead it just brings the supply air temperature closer to the existing home’s temperature while still
|
||||||
|
covering the latent and sensible loads of the home. A warmer duct system reduces the losses of the duct to unconditioned spaces as well as
|
||||||
|
reduces the risk for duct condensation.</p>
|
||||||
|
<p>The coil bypass strategy, as far as I know, was pioneered by <a href="https://www.linkedin.com/in/harry-boody-9b8a4366/">Harry Boody</a> of Energy
|
||||||
|
Innovations and Scientific Environmental Design, Inc. However their websites are no longer active, so I’m not sure if they are still active
|
||||||
|
in the HVAC design space or not.</p>
|
||||||
|
<h2>The Problem</h2>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Why</th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>Question</td>
|
||||||
|
<td>Why would we want to utilize a strategy such as the coil bypass?</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Answer</td>
|
||||||
|
<td>Improved indoor air quality (IAQ)</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<p>ASHRAE’s recommandation for the amount of air changes per hour (ACH) in a residential structure to be in the range of 3-5 ACH, and in
|
||||||
|
general the higher the better, along with a MERV 13+ filter. In some / most cases the system airflow does not meet that criteria, especially
|
||||||
|
low load homes or high volume homes.</p>
|
||||||
|
<p>For example, let’s imagine a single story ranch home that is 2,500 square feet with 9 foot ceilings. This home is relatively tight
|
||||||
|
construction and after doing the heating and cooling loads we’ve selected a 2.5 Ton system for this home. It is located in a green grass
|
||||||
|
climate that needs some priority on dehumidification and requires an airflow of 350 CFM/Ton (875 CFM).</p>
|
||||||
|
<p>We determine the volume of the conditioned space.</p>
|
||||||
|
<p>2,500 x 9 = 22,500 ft^3</p>
|
||||||
|
<p><img src="/articles/images/2023-08-10-volume-equation.png" alt="volume-equation" /></p>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th><strong>Where:</strong></th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td><strong>V</strong></td>
|
||||||
|
<td><em>is the volume of the home</em></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><strong>ACH</strong></td>
|
||||||
|
<td><em>is the desired air changes per hour</em></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><strong>60</strong></td>
|
||||||
|
<td><em>conversion from hours to minutes</em></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<p>Below is a table of the required CFM to meet the different air changes per hour.</p>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th></th>
|
||||||
|
<th align="center">CFM</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>(22,500 x 3)/60</td>
|
||||||
|
<td align="center"><strong><em>1,125 @ 3 ACH</em></strong></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>(22,500 x 4)/60</td>
|
||||||
|
<td align="center"><strong><em>1,500 @ 4 ACH</em></strong></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>(22,500 x 5)/60</td>
|
||||||
|
<td align="center"><strong><em>1,875 @ 5 ACH</em></strong></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<p>As you can see we have a discrepency of meeting even the low end of 3 ACH. The high end of 5 ACH is over 2x the airflow for our 2.5 Ton
|
||||||
|
system. The coil bypass strategy is one viable way, by decoupling the total system airflow from the coil airflow without, which eliminates
|
||||||
|
the need of an auxilary fan / system that circulates air through some sort of filtration system.</p>
|
||||||
|
<h3>Multi-Stage Systems</h3>
|
||||||
|
<p>A challenge with multi-stage systems, even when sized properly, is that we often run at part-load conditions, and spend the majority of the
|
||||||
|
time in lower stages. The lower stages often do worse at dehumidification than when running at full load.</p>
|
||||||
|
<p>When the equipment runs in lower stages on a traditional system the total system airflow is reduced even further from the recommended air
|
||||||
|
changes per hour. This reduced airflow also causes the throw of the air from the registers to be reduced which can lead to increased odds of
|
||||||
|
stratification, poor air mixing, and increased potential for poor mean radiant temperatures (MRT) of the surfaces. The decreased airflow in
|
||||||
|
low stages, lowers the velocity in the duct system, while low velocity is not a concern, it does increase the duct gains and increase the
|
||||||
|
possibility of condensation on the ducts when they’re located outside of the thermal envelope of the building.</p>
|
||||||
|
<p>Let’s imagine we have a duct system that has high wall registers located in a soffit at the interior wall that moves 100 CFM and we are
|
||||||
|
trying to throw the air to the exterior wall which includes a window. The wall is @ 12 feet from the register. We’ve selected a register
|
||||||
|
that meets the criteria, at high stage airflow it has a throw of 11.5 feet (shown as the green rectangle). When the system runs in low
|
||||||
|
stage, the airflow is reduced to 70% of high stage (70 CFM), which would give us a throw from the register of @ 7 feet (shown as the red
|
||||||
|
rectangle).</p>
|
||||||
|
<p><img src="/articles/images/2023-08-10-register-throw.png" alt="register-throw" /></p>
|
||||||
|
<p>The reduced flow through the register causes the air to only make it about 60% across the room before reaching it’s terminal velocity, which
|
||||||
|
can cause the room to feel uncomfortable since the air never reaches the exterior wall and window.</p>
|
||||||
|
<p>By decoupling the fan from the coil airflow it is possible to run in low stages, still have adequate dehumidification performance out of the
|
||||||
|
system, and achieve the proper throw from the registers.</p>
|
||||||
|
<h2>Conclusion</h2>
|
||||||
|
<p>In this article we’ve begun to scratch the surface of what a coil bypass strategy is in an HVAC system, as well as some of the challenges
|
||||||
|
that it can help solve. We’ve learned about why we may desire to decouple the total system airflow from the coil airflow.</p>
|
||||||
|
<p>In future articles we will continue to explore some of the features, benefits, and challenges presented by such a strategy.</p>
|
||||||
|
<h2>Related Resources</h2>
|
||||||
|
<p><a href="https://hvacrschool.com/bypass-dehumidification-airflow-hvac-design/">HVAC School - Bypass Dehumidification / Airflow HVAC Design</a></p>
|
||||||
|
</article>
|
||||||
|
<div class="border-t border-light mt-8 pt-8">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
Written by
|
||||||
|
</h2>
|
||||||
|
<div class="flex flex-col lg:flex-row gap-8">
|
||||||
|
<div class="flex-[0_0_120px]">
|
||||||
|
<img class="w-[120px] h-[120px] rounded-full" src="/static/images/avatar.png"/>
|
||||||
|
</div>
|
||||||
|
<div class="prose">
|
||||||
|
<h3 class="!m-0">
|
||||||
|
Michael Housh
|
||||||
|
</h3>
|
||||||
|
<p class="text-gray">
|
||||||
|
HVAC business owner with over 27 years of experience. Writes articles about HVAC,
|
||||||
|
Programming, Home-Performance, and Building Science
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-16">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
More articles
|
||||||
|
</h2>
|
||||||
|
<div class="grid lg:grid-cols-2 gap-10">
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2025/vapor-htmx-todo-app/">Vapor + HTMX</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">January 05, 2025</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/programming/">programming</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
|
Build an example application using Vapor and HTMX.
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2024/free-as-in-freedom/">Free As In Freedom</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">April 09, 2024</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/open-source/">open-source</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
|
Salute to open-source software engineers
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
<p class="prose mt-8">
|
||||||
|
<a href="/articles/">› See all articles</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="site-footer container text-gray gray-links border-t border-light text-center pt-6 mt-8 text-sm">
|
||||||
|
<p>
|
||||||
|
Copyright © Michael Housh 2023-2025.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Built in Swift using
|
||||||
|
<a href="https://github.com/loopwerk/Saga" rel="nofollow" target="_blank">Saga</a>
|
||||||
|
(<a href="https://github.com/m-housh/mhoush.com" rel="nofollow" target="_blank">source</a>).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a href="http://localhost:3000/articles/feed.xml" rel="nofollow" target="_blank">RSS</a>
|
||||||
|
|
|
||||||
|
<a href="https://github.com/m-housh" rel="nofollow" target="_blank">Github</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.youtube.com/channel/UCb58SeURd5bObfTiL0KoliA" rel="nofollow" target="_blank">Youtube</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.facebook.com/michael.housh" rel="nofollow" target="_blank">Facebook</a>
|
||||||
|
|
|
||||||
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,264 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<meta content="#0e1112" media="(prefers-color-scheme: dark)" name="theme-color"/>
|
||||||
|
<meta content="#566B78" media="(prefers-color-scheme: light)" name="theme-color"/>
|
||||||
|
<meta content="Michael Housh" name="author"/>
|
||||||
|
<meta content="Mhoush" name="apple-mobile-web-app-title"/>
|
||||||
|
<meta content="initial-scale=1.0, width=device-width" name="viewport"/>
|
||||||
|
<meta content="telephone=no" name="format-detection"/>
|
||||||
|
<meta content="True" name="HandheldFriendly"/>
|
||||||
|
<meta content="320" name="MobileOptimized"/>
|
||||||
|
<meta content="Mhoush" name="og:site_name"/>
|
||||||
|
<meta content="hvac, developer, swift, home-performance, design" name="keywords"/>
|
||||||
|
<title>
|
||||||
|
mhoush: Free quotes != good
|
||||||
|
</title>
|
||||||
|
<link href="/static/favicon.ico" rel="shortcut icon"/>
|
||||||
|
<link href="/static/output.css" rel="stylesheet"/>
|
||||||
|
<link href="/static/style.css" rel="stylesheet"/>
|
||||||
|
<link href="/articles/feed.xml" rel="alternate" title="mhoush" type="application/rss+xml"/>
|
||||||
|
<link href="/static/prism.css" rel="stylesheet"/>
|
||||||
|
<meta content="I found myself re-reading the
|
||||||
|
ACCA Quality Installation Standard
|
||||||
|
recently and it got me thinking about the industries tendency of offering free quotes. In this article, I’d like to just focus in on the
|
||||||
|
items that are required as what I’m calling..." name="description"/>
|
||||||
|
<meta content="summary_large_image" name="twitter:card"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-10-04-free-quotes-are-bad-for-the-industry.png" name="twitter:image"/>
|
||||||
|
<meta content="Free quotes != good" name="twitter:image:alt"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images//articles/2023/free-quotes-are-bad-for-the-industry/" name="og:url"/>
|
||||||
|
<meta content="Free quotes != good" name="og:title"/>
|
||||||
|
<meta content="I found myself re-reading the
|
||||||
|
ACCA Quality Installation Standard
|
||||||
|
recently and it got me thinking about the industries tendency of offering free quotes. In this article, I’d like to just focus in on the
|
||||||
|
items that are required as what I’m calling..." name="og:description"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-10-04-free-quotes-are-bad-for-the-industry.png" name="og:image"/>
|
||||||
|
<meta content="1014" name="og:image:width"/>
|
||||||
|
<meta content="530" name="og:image:height"/>
|
||||||
|
<script crossorigin="anonymous" src="https://kit.fontawesome.com/f209982030.js">
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body class="bg-page text-white pb-5 font-avenir articles">
|
||||||
|
<header class="bg-nav text-gray py-4 text-base/6 lg:fixed w-full lg:h-[62px]">
|
||||||
|
<nav class="container flex gap-x-5 lg:gap-x-y items-center">
|
||||||
|
<ul class="flex flex-wrap gap-x-2 lg:gap-x-5">
|
||||||
|
<li>
|
||||||
|
<a class href="/">Home</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="active" href="/articles/">Articles</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class href="/about/">About</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<div class="container pt-12 lg:pt-28">
|
||||||
|
<article class="prose">
|
||||||
|
<h1>
|
||||||
|
Free quotes != good
|
||||||
|
</h1>
|
||||||
|
<div class="-mt-6">
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">October 04, 2023</span>934 words, posted in <a href="/articles/tag/hvac/">HVAC</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<img alt="banner" src="http://localhost:3000/articles/images/2023-10-04-free-quotes-are-bad-for-the-industry.png"/>
|
||||||
|
<p>I found myself re-reading the
|
||||||
|
<a href="https://www.acca.org/communities/community-home/librarydocuments/viewdocument?DocumentKey=b1d2a39d-fda8-4af9-b8de-0ae579bfe24a">ACCA Quality Installation Standard</a>
|
||||||
|
recently and it got me thinking about the industries tendency of offering free quotes. In this article, I’d like to just focus in on the
|
||||||
|
items that are required as what I’m calling “prior to installation” items.</p>
|
||||||
|
<h2>Prior to installation</h2>
|
||||||
|
<ol>
|
||||||
|
<li>Ensure ventilation calculations are performed.</li>
|
||||||
|
<li>Building heat gain / loss calculation (Manual-J / Manual-N)
|
||||||
|
<ol>
|
||||||
|
<li>Room x room for new construction or duct modifications.</li>
|
||||||
|
<li>Block load for existing (can use original if available).</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Proper equipment capacity selection (Manual-S / Manual-CS)</li>
|
||||||
|
<li>Properly matched systems (AHRI or CEE-AHRI)</li>
|
||||||
|
</ol>
|
||||||
|
<p>Let’s break the above items down to a rough estimated time to complete each of the items.</p>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Item</th>
|
||||||
|
<th>Time (minutes)</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>Ventilation calculations</td>
|
||||||
|
<td>15</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Manual-J (data gathering)</td>
|
||||||
|
<td>30</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Manual-J (data entry / calculation)</td>
|
||||||
|
<td>30</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Manual-S</td>
|
||||||
|
<td>15</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>AHRI</td>
|
||||||
|
<td>15</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><strong>Total</strong></td>
|
||||||
|
<td>105</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<blockquote>
|
||||||
|
<p><em>The above items are obviously just estimations and the person’s experience in the different areas / tools they use. Some of the items are
|
||||||
|
probably on the low side while others are probably on the high side.</em></p>
|
||||||
|
</blockquote>
|
||||||
|
<p>This is 1.75 hours just to do the calculations required to meet the QI Standard. This does not include any of the time spent with the
|
||||||
|
customer building value in you or your product recommendations.</p>
|
||||||
|
<p>When you want to not guess at some of the calculations then a blower door test is generally required in order to understand the leakage of
|
||||||
|
the home, which adds even more time to the estimation process. Depending on the understanding you are looking for, the blower door test can
|
||||||
|
add 30-180 minutes. This takes the total time to 2.25-4.75 hours.</p>
|
||||||
|
<h2>Pushing boxes</h2>
|
||||||
|
<p>The majority of residential HVAC companies make the bulk of their income off of equipment sales, so they have to “feed the beast” by
|
||||||
|
skipping steps in both the installation of equipment and the sales process in order to close jobs and keep the ship afloat.</p>
|
||||||
|
<p><img src="/articles/images/2023-10-04-sinking-boat.png" alt="sinking-boat" /></p>
|
||||||
|
<p>This has helped contribute to these industry statistics:<a href="DOE" title="2018">^1</a></p>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Incorrect refrigerant charge in greater than 50-80% of systems.</strong></li>
|
||||||
|
<li><strong>Improper airflow:</strong>
|
||||||
|
<ul>
|
||||||
|
<li><strong>70% above the rated 0.5” w.c.</strong></li>
|
||||||
|
<li><strong>47% above 0.7” w.c.</strong></li>
|
||||||
|
<li><strong>85% undersized / inappropriate filter.</strong></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><strong>70-80% of systems have at least one fault.</strong></li>
|
||||||
|
<li><strong>90-100% if duct leakage is considered.</strong></li>
|
||||||
|
</ul>
|
||||||
|
<h2>Consumer responsibility</h2>
|
||||||
|
<p>Let me be clear, I don’t think that all the blame is on the industry here. The culture today is that everyone wants things for free and
|
||||||
|
fast. They have been conditioned by online services and box stores. Should we not cater to those that aren’t willing to do their leg work?
|
||||||
|
Is it really our fault, if they don’t care?</p>
|
||||||
|
<h2>Liability</h2>
|
||||||
|
<p>While it’s generally easy to shrug our shoulders and think that it’s ok to just continue on because all the competitors are doing the same
|
||||||
|
thing. There is at least the possibility that skipping steps can come back to bite you. If things ever went to litigation and the steps
|
||||||
|
outlined in the QI Standard are ignored, then there is high odds you would loose.</p>
|
||||||
|
<p>No matter what you do to try and protect yourself (having customers sign-off, etc) does not adequately protect your company from litigation.
|
||||||
|
There are stories out there where contractors were still held liable for not performing load calculations even though the consumer signed
|
||||||
|
off on it, because it is not inline with “industry best practices.”</p>
|
||||||
|
<h1>Summary</h1>
|
||||||
|
<p>This has led me to the conclusion that free quotes are just bad for the industry in general. The path forward is a challenge (changing
|
||||||
|
perception is hard). I don’t know that I have answers on what the best path forward is, to be frank, but I do know that our current <em>status
|
||||||
|
quo</em> is subpar to say the least.</p>
|
||||||
|
<p>Unfortunately, I don’t think the change is going to come from the industry, but that it’s going to require the consumer base to be more
|
||||||
|
educated and demand more from the industry. There have been many organizations that have dedicated years to changing the skill levels of
|
||||||
|
technicians in the industry, they are very well needed / don’t mistake my words here, however unless a company has faced litigation or
|
||||||
|
facing requests on a regular basis that demand better results, then why would a company change!?!</p>
|
||||||
|
<p>I’ve been trying (unsuccessfully) to get rid of free quotes for 5+ years in my company. We try to educate customers during maintenance
|
||||||
|
visits and when scheduling equipment estimates, however only about 10-20% choose to go down our paid Home Performance Assessment path. Our
|
||||||
|
installation process does follow the QI Standard for the items that pertain to the setup / commissioning of the installed equipment, however
|
||||||
|
there is just no sustainable way for us to completely follow the items outlined in this article without charging for our time, because at
|
||||||
|
the end of the day we still have to be competitive in our market.</p>
|
||||||
|
<p>There are days that I can justify our actions to myself and also days that I just want to throw in the towel / not sacrifice our integrity.
|
||||||
|
Integrity is something that I take very seriously, after all our companies tag line is <em>“Since 1954, Integrity is in the Housh!”</em></p>
|
||||||
|
<p>As mentioned, I’m not sure what the best path forward is! I hate to not have answers, but some problems are just complex and somewhat beyond
|
||||||
|
our control.</p>
|
||||||
|
<p>Let me know what you think some good solutions are.</p>
|
||||||
|
<ul>
|
||||||
|
<li>Does your company follow the QI Standard?</li>
|
||||||
|
<li>What are resources that you’ve found helpful in educating your customers?</li>
|
||||||
|
</ul>
|
||||||
|
</article>
|
||||||
|
<div class="border-t border-light mt-8 pt-8">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
Written by
|
||||||
|
</h2>
|
||||||
|
<div class="flex flex-col lg:flex-row gap-8">
|
||||||
|
<div class="flex-[0_0_120px]">
|
||||||
|
<img class="w-[120px] h-[120px] rounded-full" src="/static/images/avatar.png"/>
|
||||||
|
</div>
|
||||||
|
<div class="prose">
|
||||||
|
<h3 class="!m-0">
|
||||||
|
Michael Housh
|
||||||
|
</h3>
|
||||||
|
<p class="text-gray">
|
||||||
|
HVAC business owner with over 27 years of experience. Writes articles about HVAC,
|
||||||
|
Programming, Home-Performance, and Building Science
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-16">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
More articles
|
||||||
|
</h2>
|
||||||
|
<div class="grid lg:grid-cols-2 gap-10">
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2025/vapor-htmx-todo-app/">Vapor + HTMX</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">January 05, 2025</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/programming/">programming</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
|
Build an example application using Vapor and HTMX.
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2024/free-as-in-freedom/">Free As In Freedom</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">April 09, 2024</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/open-source/">open-source</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
|
Salute to open-source software engineers
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
<p class="prose mt-8">
|
||||||
|
<a href="/articles/">› See all articles</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="site-footer container text-gray gray-links border-t border-light text-center pt-6 mt-8 text-sm">
|
||||||
|
<p>
|
||||||
|
Copyright © Michael Housh 2023-2025.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Built in Swift using
|
||||||
|
<a href="https://github.com/loopwerk/Saga" rel="nofollow" target="_blank">Saga</a>
|
||||||
|
(<a href="https://github.com/m-housh/mhoush.com" rel="nofollow" target="_blank">source</a>).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a href="http://localhost:3000/articles/feed.xml" rel="nofollow" target="_blank">RSS</a>
|
||||||
|
|
|
||||||
|
<a href="https://github.com/m-housh" rel="nofollow" target="_blank">Github</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.youtube.com/channel/UCb58SeURd5bObfTiL0KoliA" rel="nofollow" target="_blank">Youtube</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.facebook.com/michael.housh" rel="nofollow" target="_blank">Facebook</a>
|
||||||
|
|
|
||||||
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -68,48 +68,48 @@ I have always had a love and passion for..." name="og:description"/>
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2023-10-27-heat-recovery-chiller.png"/>
|
<img alt="banner" src="http://localhost:3000/articles/images/2023-10-27-heat-recovery-chiller.png"/>
|
||||||
<p>This is an article that I wrote back in 2020, but I don’t believe that I published it anywhere, so<br />
|
<p>This is an article that I wrote back in 2020, but I don’t believe that I published it anywhere, so
|
||||||
I’m doing it now. I did discuss this on<br />
|
I’m doing it now. I did discuss this on
|
||||||
<a href="https://hvacrschool.com/podcasts/is-the-future-of-air-conditioning-self-contained-propane-chillers/">this episode of the HVAC School Podcast.</a></p>
|
<a href="https://hvacrschool.com/podcasts/is-the-future-of-air-conditioning-self-contained-propane-chillers/">this episode of the HVAC School Podcast.</a></p>
|
||||||
<h2>Heat Recovery Chillers</h2>
|
<h2>Heat Recovery Chillers</h2>
|
||||||
<p>I have always had a love and passion for hydronic systems, perhaps it’s because they are not that<br />
|
<p>I have always had a love and passion for hydronic systems, perhaps it’s because they are not that
|
||||||
common in most areas. The designs tend to be elegant and the flexibility is unparalleled by most<br />
|
common in most areas. The designs tend to be elegant and the flexibility is unparalleled by most
|
||||||
equipment choices currently available in the U.S. I’m going to try to not get too far into the weeds<br />
|
equipment choices currently available in the U.S. I’m going to try to not get too far into the weeds
|
||||||
in this article, but offer an overview of what I feel would be my dream system.</p>
|
in this article, but offer an overview of what I feel would be my dream system.</p>
|
||||||
<h2>The Source</h2>
|
<h2>The Source</h2>
|
||||||
<p>A heat recovery chiller will do simultaneous heating and cooling, as opposed to a traditional<br />
|
<p>A heat recovery chiller will do simultaneous heating and cooling, as opposed to a traditional
|
||||||
heat-pump or reverse cycle chiller that can only operate in one mode at a time. This system would<br />
|
heat-pump or reverse cycle chiller that can only operate in one mode at a time. This system would
|
||||||
have a second refrigerant to water heat exchanger and utilize the air-source when we don’t need to<br />
|
have a second refrigerant to water heat exchanger and utilize the air-source when we don’t need to
|
||||||
bank / store heat, or are running in heat only mode. There are several benefits to this style<br />
|
bank / store heat, or are running in heat only mode. There are several benefits to this style
|
||||||
system, the main being that while operating simultaneous heating / cooling mode the COP of the<br />
|
system, the main being that while operating simultaneous heating / cooling mode the COP of the
|
||||||
system doubles. For example, the <a href="https://multiaqua.com/mhrc2/">Multi-Aqua MHRC2</a> shows a COP of<br />
|
system doubles. For example, the <a href="https://multiaqua.com/mhrc2/">Multi-Aqua MHRC2</a> shows a COP of
|
||||||
about 8, which is approximately equivalent to 30 EER or 34 SEER. This gives us geothermal level<br />
|
about 8, which is approximately equivalent to 30 EER or 34 SEER. This gives us geothermal level
|
||||||
performance without the need of a field.</p>
|
performance without the need of a field.</p>
|
||||||
<h2>Indoor Portion</h2>
|
<h2>Indoor Portion</h2>
|
||||||
<p>The indoor portion of the system, we would utilize buffer tanks as thermal storage for the chiller.<br />
|
<p>The indoor portion of the system, we would utilize buffer tanks as thermal storage for the chiller.
|
||||||
The buffer tanks give us several benefits, including longer run times for the chiller, load<br />
|
The buffer tanks give us several benefits, including longer run times for the chiller, load
|
||||||
matching, and the ability to size for larger load (heating or cooling) without some of the problems<br />
|
matching, and the ability to size for larger load (heating or cooling) without some of the problems
|
||||||
that occur when over-sizing a traditional system. The buffer tanks also allow sizing more<br />
|
that occur when over-sizing a traditional system. The buffer tanks also allow sizing more
|
||||||
aggressively by having storage during peak load conditions.</p>
|
aggressively by having storage during peak load conditions.</p>
|
||||||
<p><img src="/articles/images/2023-10-27-buffers2.png" alt="buffer" /></p>
|
<p><img src="/articles/images/2023-10-27-buffers2.png" alt="buffer" /></p>
|
||||||
<p>This shows a cooling buffer tank as well as a heating buffer tank. The horizontal pumps are what<br />
|
<p>This shows a cooling buffer tank as well as a heating buffer tank. The horizontal pumps are what
|
||||||
circulate water through the chiller, while the vertical pumps are what distribute the water to the<br />
|
circulate water through the chiller, while the vertical pumps are what distribute the water to the
|
||||||
load / emitters. This configuration allows for water to be used for the loads first and extra<br />
|
load / emitters. This configuration allows for water to be used for the loads first and extra
|
||||||
capacity to go into the buffer tanks. The buffer tanks also offer hydraulic separation for the pumps<br />
|
capacity to go into the buffer tanks. The buffer tanks also offer hydraulic separation for the pumps
|
||||||
(meaning that they won’t interfere with each other if / when there are different flow rates).<br />
|
(meaning that they won’t interfere with each other if / when there are different flow rates).
|
||||||
Another advantage of the buffer tanks is that you can connect multiple heating or cooling sources in<br />
|
Another advantage of the buffer tanks is that you can connect multiple heating or cooling sources in
|
||||||
parallel to the system. This is shown by the extra tees in the hot buffer tank where we could<br />
|
parallel to the system. This is shown by the extra tees in the hot buffer tank where we could
|
||||||
connect something such as solar water collectors, pellet or wood boiler, or a conventional boiler.<br />
|
connect something such as solar water collectors, pellet or wood boiler, or a conventional boiler.
|
||||||
You’ll also notice on the right side of the hot buffer tank, that I am showing a brazed plate heat<br />
|
You’ll also notice on the right side of the hot buffer tank, that I am showing a brazed plate heat
|
||||||
exchanger that would be used to supply domestic hot water.</p>
|
exchanger that would be used to supply domestic hot water.</p>
|
||||||
<h2>Distribution System</h2>
|
<h2>Distribution System</h2>
|
||||||
<p>This could be a number of things, from radiant panels, in-floor, high-output baseboard radiators,<br />
|
<p>This could be a number of things, from radiant panels, in-floor, high-output baseboard radiators,
|
||||||
however I’m going to model it as a 4-pipe hydronic air handler.</p>
|
however I’m going to model it as a 4-pipe hydronic air handler.</p>
|
||||||
<p><img src="/articles/images/2023-10-27-ah.png" alt="ah" /></p>
|
<p><img src="/articles/images/2023-10-27-ah.png" alt="ah" /></p>
|
||||||
<p>The hydronic air handler is able to provide cooling, heating, and re-heat dehumidification, all in<br />
|
<p>The hydronic air handler is able to provide cooling, heating, and re-heat dehumidification, all in
|
||||||
one package. With a hydronic system, it would be very easy to load match by controlling the fan<br />
|
one package. With a hydronic system, it would be very easy to load match by controlling the fan
|
||||||
speed and utilizing a Delta-T pump or outdoor reset controls. These air handlers are available from<br />
|
speed and utilizing a Delta-T pump or outdoor reset controls. These air handlers are available from
|
||||||
several manufacturers and come in different styles from traditional (as shown), small duct high<br />
|
several manufacturers and come in different styles from traditional (as shown), small duct high
|
||||||
velocity systems, and even ductless styles.</p>
|
velocity systems, and even ductless styles.</p>
|
||||||
<h2>Disadvantages</h2>
|
<h2>Disadvantages</h2>
|
||||||
<ol>
|
<ol>
|
||||||
@@ -118,7 +118,7 @@ velocity systems, and even ductless styles.</p>
|
|||||||
<li>Lack of understanding / technicians afraid to work on this style system.</li>
|
<li>Lack of understanding / technicians afraid to work on this style system.</li>
|
||||||
<li>Potentially higher upfront costs.</li>
|
<li>Potentially higher upfront costs.</li>
|
||||||
<li>Lack of design or planning could cause unhappy clients (same with traditional)</li>
|
<li>Lack of design or planning could cause unhappy clients (same with traditional)</li>
|
||||||
<li>Distribution systems need to be designed around low water temperatures (not a drop in replacement<br />
|
<li>Distribution systems need to be designed around low water temperatures (not a drop in replacement
|
||||||
for traditional boiler systems)</li>
|
for traditional boiler systems)</li>
|
||||||
</ol>
|
</ol>
|
||||||
<h2>Advantages</h2>
|
<h2>Advantages</h2>
|
||||||
@@ -132,11 +132,11 @@ for traditional boiler systems)</li>
|
|||||||
<li>Easier transition to natural / flammable refrigerants</li>
|
<li>Easier transition to natural / flammable refrigerants</li>
|
||||||
</ol>
|
</ol>
|
||||||
<h2>Conclusion</h2>
|
<h2>Conclusion</h2>
|
||||||
<p>In conclusion, there are many advantages to this style system, as well as disadvantages. One of the<br />
|
<p>In conclusion, there are many advantages to this style system, as well as disadvantages. One of the
|
||||||
main points is to think of the system in 3 distinct components, the source(s), thermal storage, and<br />
|
main points is to think of the system in 3 distinct components, the source(s), thermal storage, and
|
||||||
distribution. As mentioned, this only one concept, but in reality, there are many ways to accomplish<br />
|
distribution. As mentioned, this only one concept, but in reality, there are many ways to accomplish
|
||||||
this, which is one of it’s advantages. For example, perhaps in certain scenarios it makes sense to<br />
|
this, which is one of it’s advantages. For example, perhaps in certain scenarios it makes sense to
|
||||||
dump excess heat into a pool, create ice storage during off peak hours, cascade into another water<br />
|
dump excess heat into a pool, create ice storage during off peak hours, cascade into another water
|
||||||
-> water heat pump for higher temperature distribution, incorporate solar collectors, and so on.</p>
|
-> water heat pump for higher temperature distribution, incorporate solar collectors, and so on.</p>
|
||||||
<p>Thank you for reading all the way to the end!</p>
|
<p>Thank you for reading all the way to the end!</p>
|
||||||
</article>
|
</article>
|
||||||
@@ -173,7 +173,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2025-01-05-vapor-htmx-todo-app.png"/>
|
|
||||||
Build an example application using Vapor and HTMX.
|
Build an example application using Vapor and HTMX.
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -187,7 +186,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2024/free-as-in-freedom/"><div>
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2024-04-09-free-as-in-freedom.png"/>
|
|
||||||
Salute to open-source software engineers
|
Salute to open-source software engineers
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -218,6 +216,12 @@ Programming, Home-Performance, and Building Science
|
|||||||
|
|
|
|
||||||
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
</p>
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -66,50 +66,50 @@ article I’d like to take a minute to layout some of the things that give..." n
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2023-10-30-hope.png"/>
|
<img alt="banner" src="http://localhost:3000/articles/images/2023-10-30-hope.png"/>
|
||||||
<p>This is a piggy-back article off of<br />
|
<p>This is a piggy-back article off of
|
||||||
<a href="https://mhoush.com/posts/20231018224631-the-struggle/">The Struggle</a> article that I had recently.</p>
|
<a href="https://mhoush.com/posts/20231018224631-the-struggle/">The Struggle</a> article that I had recently.</p>
|
||||||
<p>I was a bit of a “Debbie Downer” in that article, which is okay, I get that way sometimes. In this<br />
|
<p>I was a bit of a “Debbie Downer” in that article, which is okay, I get that way sometimes. In this
|
||||||
article I’d like to take a minute to layout some of the things that give me hope, things that I<br />
|
article I’d like to take a minute to layout some of the things that give me hope, things that I
|
||||||
focus on to try and kick myself out of the rut I can get into sometimes.</p>
|
focus on to try and kick myself out of the rut I can get into sometimes.</p>
|
||||||
<p>I believe it’s important to have <strong>hope</strong>, to realize that feeling down is normal / part of being<br />
|
<p>I believe it’s important to have <strong>hope</strong>, to realize that feeling down is normal / part of being
|
||||||
human. It’s just as important to have hope. For some it is a harder thing to focus on, it may be<br />
|
human. It’s just as important to have hope. For some it is a harder thing to focus on, it may be
|
||||||
easy for us to try and dwell in negative feelings, to some that may feel more comfortable. When<br />
|
easy for us to try and dwell in negative feelings, to some that may feel more comfortable. When
|
||||||
we’re feeling cynical, it’s easy to feed the negativity, although it’s rarely helpful.</p>
|
we’re feeling cynical, it’s easy to feed the negativity, although it’s rarely helpful.</p>
|
||||||
<h2>Hope</h2>
|
<h2>Hope</h2>
|
||||||
<p>One of the things that I try to focus on is that I’m human, it brings me hope to realize that I’m<br />
|
<p>One of the things that I try to focus on is that I’m human, it brings me hope to realize that I’m
|
||||||
not the only one who feels the way that I do. This was evident by the feedback on my previous<br />
|
not the only one who feels the way that I do. This was evident by the feedback on my previous
|
||||||
article.</p>
|
article.</p>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>My problems are very much “first world problems”.</p>
|
<p>My problems are very much “first world problems”.</p>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<p>Make no mistake, I’m selfish, but it’s the selfishness that makes me feel distant or disconnected.<br />
|
<p>Make no mistake, I’m selfish, but it’s the selfishness that makes me feel distant or disconnected.
|
||||||
The times that I feel connected are without a doubt the times that I let go of my ego and focus on<br />
|
The times that I feel connected are without a doubt the times that I let go of my ego and focus on
|
||||||
things outside of myself.</p>
|
things outside of myself.</p>
|
||||||
<p>It’s the feeling I get from going to customers home and feeling truly appreciated. There’s no push<br />
|
<p>It’s the feeling I get from going to customers home and feeling truly appreciated. There’s no push
|
||||||
back on price, no one telling me how I should run my business, no “the part only costs $x on<br />
|
back on price, no one telling me how I should run my business, no “the part only costs $x on
|
||||||
amazon”, etc.</p>
|
amazon”, etc.</p>
|
||||||
<p>The feeling of seeing your child smile. The safety you feel when getting a hug from your mother or<br />
|
<p>The feeling of seeing your child smile. The safety you feel when getting a hug from your mother or
|
||||||
father. When you’re looking up at the stars and realize how small you actually are.</p>
|
father. When you’re looking up at the stars and realize how small you actually are.</p>
|
||||||
<p>When you’re out with friends and trick the DJ into playing a Mr. Bungle song and no one else<br />
|
<p>When you’re out with friends and trick the DJ into playing a Mr. Bungle song and no one else
|
||||||
appreciates it, but you. The times when your guard is completely down and you laugh with abandon.</p>
|
appreciates it, but you. The times when your guard is completely down and you laugh with abandon.</p>
|
||||||
<p>The smell of your lover’s hair when you’re holding them close. The joy you receive from sitting with<br />
|
<p>The smell of your lover’s hair when you’re holding them close. The joy you receive from sitting with
|
||||||
your pets. The songs of nature, insects, birds, etc. The sounds of waves / water in the distance.</p>
|
your pets. The songs of nature, insects, birds, etc. The sounds of waves / water in the distance.</p>
|
||||||
<p>The feeling when you’ve helped someone learn a new skill, when something finally clicks and makes<br />
|
<p>The feeling when you’ve helped someone learn a new skill, when something finally clicks and makes
|
||||||
sense. When a complex topic is understood at a fundamental level. The breakthrough of a problem<br />
|
sense. When a complex topic is understood at a fundamental level. The breakthrough of a problem
|
||||||
you’ve pondered for days / months / years.</p>
|
you’ve pondered for days / months / years.</p>
|
||||||
<h2>Conclusion</h2>
|
<h2>Conclusion</h2>
|
||||||
<p>There are so many things to be grateful for. This does not mean that there will not be hard times,<br />
|
<p>There are so many things to be grateful for. This does not mean that there will not be hard times,
|
||||||
there surely will be. This does not mean that you are wrong for having negative feelings, for<br />
|
there surely will be. This does not mean that you are wrong for having negative feelings, for
|
||||||
feeling depressed or anxious. There are many around you that likely feel similar (they may just not<br />
|
feeling depressed or anxious. There are many around you that likely feel similar (they may just not
|
||||||
be able to express it in the same way). You never truly know what the person next to you is dealing<br />
|
be able to express it in the same way). You never truly know what the person next to you is dealing
|
||||||
with. Be compassionate (including showing yourself compassion).</p>
|
with. Be compassionate (including showing yourself compassion).</p>
|
||||||
<p>When you are feeling down, try to do something for someone else. Make your own list of things to be<br />
|
<p>When you are feeling down, try to do something for someone else. Make your own list of things to be
|
||||||
thankful for. Maybe my non-exhaustive list above will give you some ideas. Write those items down<br />
|
thankful for. Maybe my non-exhaustive list above will give you some ideas. Write those items down
|
||||||
regularly so that you can look back on them when you feel out of balance.</p>
|
regularly so that you can look back on them when you feel out of balance.</p>
|
||||||
<p>There is plenty of negative energy in this world, be true and genuine and you will receive rewards.<br />
|
<p>There is plenty of negative energy in this world, be true and genuine and you will receive rewards.
|
||||||
When you focus on blessings then the negativity will fade.</p>
|
When you focus on blessings then the negativity will fade.</p>
|
||||||
<p>What impact are you going to leave with what little time we have?</p>
|
<p>What impact are you going to leave with what little time we have?</p>
|
||||||
<p>I hope that you enjoyed this short article. Know that you are <em>NOT</em> alone, you are important, and<br />
|
<p>I hope that you enjoyed this short article. Know that you are <em>NOT</em> alone, you are important, and
|
||||||
that I appreciate <em>you!</em></p>
|
that I appreciate <em>you!</em></p>
|
||||||
</article>
|
</article>
|
||||||
<div class="border-t border-light mt-8 pt-8">
|
<div class="border-t border-light mt-8 pt-8">
|
||||||
@@ -145,7 +145,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2025-01-05-vapor-htmx-todo-app.png"/>
|
|
||||||
Build an example application using Vapor and HTMX.
|
Build an example application using Vapor and HTMX.
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -159,7 +158,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2024/free-as-in-freedom/"><div>
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2024-04-09-free-as-in-freedom.png"/>
|
|
||||||
Salute to open-source software engineers
|
Salute to open-source software engineers
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -190,6 +188,12 @@ Programming, Home-Performance, and Building Science
|
|||||||
|
|
|
|
||||||
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
</p>
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -123,6 +123,77 @@ The struggle
|
|||||||
It has been one of those “when it rains, it pours” type of weeks. As...</a>
|
It has been one of those “when it rains, it pours” type of weeks. As...</a>
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
<section class="mb-10">
|
||||||
|
<h1 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2023/free-quotes-are-bad-for-the-industry/">Free quotes != good</a>
|
||||||
|
</h1>
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">October 04, 2023</span>934 words, posted in <a href="/articles/tag/hvac/">HVAC</a>
|
||||||
|
</div>
|
||||||
|
<p class="mt-4">
|
||||||
|
<a href="/articles/2023/free-quotes-are-bad-for-the-industry/">I found myself re-reading the
|
||||||
|
ACCA Quality Installation Standard
|
||||||
|
recently and it got me thinking about the industries tendency of offering free quotes. In this article, I’d like to just focus in on the
|
||||||
|
items that are required as what I’m calling...</a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section class="mb-10">
|
||||||
|
<h1 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2023/introduction-to-programming-for-hvac-4/">Introduction to Programming for HVAC Part-4</a>
|
||||||
|
</h1>
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">September 26, 2023</span>1159 words, posted in <a href="/articles/tag/hvac/">HVAC</a>, <a href="/articles/tag/programming/">programming</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p class="mt-4">
|
||||||
|
<a href="/articles/2023/introduction-to-programming-for-hvac-4/">This article builds upon our last 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...</a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section class="mb-10">
|
||||||
|
<h1 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2023/introduction-to-programming-for-hvac-3/">Introduction to Programming for HVAC Part-3</a>
|
||||||
|
</h1>
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">September 24, 2023</span>742 words, posted in <a href="/articles/tag/hvac/">HVAC</a>, <a href="/articles/tag/programming/">programming</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p class="mt-4">
|
||||||
|
<a href="/articles/2023/introduction-to-programming-for-hvac-3/">In this article we will put together some of the pieces from the last 2 articles, and build our first program. If you have missed the first
|
||||||
|
articles, then you can catch up here before continuing with this article.
|
||||||
|
Getting Started
|
||||||
|
We are going to make...</a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section class="mb-10">
|
||||||
|
<h1 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2023/introduction-to-programming-for-hvac-2/">Introduction to Programming for HVAC Part-2</a>
|
||||||
|
</h1>
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">September 22, 2023</span>537 words, posted in <a href="/articles/tag/hvac/">HVAC</a>, <a href="/articles/tag/programming/">programming</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p class="mt-4">
|
||||||
|
<a href="/articles/2023/introduction-to-programming-for-hvac-2/">In this article, learn about installing a package manager. If you missed it, check out the
|
||||||
|
first article in the series where we learned about using your terminal.
|
||||||
|
This article builds upon that foundation.
|
||||||
|
What is a Package Manager
|
||||||
|
A package manager...</a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section class="mb-10">
|
||||||
|
<h1 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2023/introduction-to-programming-for-hvac-1/">Introduction to Programming for HVAC Part-1</a>
|
||||||
|
</h1>
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">September 21, 2023</span>1650 words, posted in <a href="/articles/tag/hvac/">HVAC</a>, <a href="/articles/tag/programming/">programming</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p class="mt-4">
|
||||||
|
<a href="/articles/2023/introduction-to-programming-for-hvac-1/">This is part one of a series of articles to help HVAC technicians (or others) get started in developing their skills to program. This can
|
||||||
|
help to automate everyday tasks or just familiarize themselves with some of the tools used by programmers.
|
||||||
|
Why
|
||||||
|
I...</a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
<section class="mb-10">
|
<section class="mb-10">
|
||||||
<h1 class="text-2xl font-bold mb-2">
|
<h1 class="text-2xl font-bold mb-2">
|
||||||
<a class="[&:hover]:border-b border-orange" href="/articles/2023/calculate-seer-degradation-by-age/">Calculate SEER Degradation by Age</a>
|
<a class="[&:hover]:border-b border-orange" href="/articles/2023/calculate-seer-degradation-by-age/">Calculate SEER Degradation by Age</a>
|
||||||
@@ -137,6 +208,86 @@ The degradation of SEER is due to fouling of the evaporator coil with dirt and
|
|||||||
refrigerant charge losses. It should be noted that this is not true for...</a>
|
refrigerant charge losses. It should be noted that this is not true for...</a>
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
<section class="mb-10">
|
||||||
|
<h1 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2023/introducing-psychrometrics-cli/">Introducing Psychrometrics CLI</a>
|
||||||
|
</h1>
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">September 18, 2023</span>538 words, posted in <a href="/articles/tag/hvac/">HVAC</a>, <a href="/articles/tag/psychrometrics/">psychrometrics</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p class="mt-4">
|
||||||
|
<a href="/articles/2023/introducing-psychrometrics-cli/">Today, I’m releasing a command line application that is built on top of my
|
||||||
|
swift-psychrometrics package, that I open sourced over 2 years ago.
|
||||||
|
The application consists of many calculations / conversions for psychrometric properties of an air stream....</a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section class="mb-10">
|
||||||
|
<h1 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2023/sizing-dehumidifier-by-latent-load/">Dehumidifier Sizing by Latent Load</a>
|
||||||
|
</h1>
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">September 15, 2023</span>267 words, posted in <a href="/articles/tag/hvac/">HVAC</a>, <a href="/articles/tag/design/">design</a>, <a href="/articles/tag/formulas/">formulas</a> and <a href="/articles/tag/tech-tip/">tech-tip</a>
|
||||||
|
</div>
|
||||||
|
<p class="mt-4">
|
||||||
|
<a href="/articles/2023/sizing-dehumidifier-by-latent-load/">This is a quick article to show how to calculate the size of dehumidifier needed based on the latent load of a building. This is useful if
|
||||||
|
you’ve done a load calculation and know the latent load of the structure.
|
||||||
|
Formulas
|
||||||
|
The formula above is used to...</a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section class="mb-10">
|
||||||
|
<h1 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2023/why-mini-splits-stink/">Why Mini Splits Stink</a>
|
||||||
|
</h1>
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">September 14, 2023</span>758 words, posted in <a href="/articles/tag/hvac/">HVAC</a>
|
||||||
|
</div>
|
||||||
|
<p class="mt-4">
|
||||||
|
<a href="/articles/2023/why-mini-splits-stink/">In this general article, I explain why I don’t generally like to use mini-splits.
|
||||||
|
The Positive Sides
|
||||||
|
When people say mini-splits, in general we mean “ductless” style units. These can either be high wall, floor mounted, or ceiling mounted
|
||||||
|
consoles....</a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section class="mb-10">
|
||||||
|
<h1 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2023/pounds-of-water-removed/">Pounds of Water Removed</a>
|
||||||
|
</h1>
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">September 08, 2023</span>381 words, posted in <a href="/articles/tag/hvac/">HVAC</a>, <a href="/articles/tag/formulas/">formulas</a>, <a href="/articles/tag/psychrometric-chart/">psychrometric-chart</a>, <a href="/articles/tag/psychrometrics/">psychrometrics</a> and <a href="/articles/tag/tech-tip/">tech-tip</a>
|
||||||
|
</div>
|
||||||
|
<p class="mt-4">
|
||||||
|
<a href="/articles/2023/pounds-of-water-removed/">This is an article that shows how to calculate the pounds of water removed from an air stream, given the entering conditions (return air
|
||||||
|
stream) and the outlet conditions (supply air stream).
|
||||||
|
This is useful in the field when you want to calculate the...</a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section class="mb-10">
|
||||||
|
<h1 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2023/rss-feed/">Rss Feed</a>
|
||||||
|
</h1>
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">August 10, 2023</span>166 words, posted in <a href="/articles/tag/how-to/">how-to</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p class="mt-4">
|
||||||
|
<a href="/articles/2023/rss-feed/">In this article I will show how to add this site’s rss feed. In particular, we will be using NetNewsWire as the
|
||||||
|
rss reader.
|
||||||
|
What is an RSS Feed
|
||||||
|
An RSS feed will show you new posts, generally from a blog, without having to remember to check the...</a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section class="mb-10">
|
||||||
|
<h1 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2023/coil-bypass-overview/">Coil Bypass Overview</a>
|
||||||
|
</h1>
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">August 10, 2023</span>1010 words, posted in <a href="/articles/tag/hvac/">HVAC</a> and <a href="/articles/tag/design/">design</a>
|
||||||
|
</div>
|
||||||
|
<p class="mt-4">
|
||||||
|
<a href="/articles/2023/coil-bypass-overview/">This is the first article in a series that explores the idea of a coil bypass strategy in an HVAC system. This article introduces you to a
|
||||||
|
coil bypass strategy at a high level, future posts will dive deeper into the features, benefits, as well as the...</a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
</div>
|
</div>
|
||||||
<div class="site-footer container text-gray gray-links border-t border-light text-center pt-6 mt-8 text-sm">
|
<div class="site-footer container text-gray gray-links border-t border-light text-center pt-6 mt-8 text-sm">
|
||||||
<p>
|
<p>
|
||||||
@@ -158,6 +309,12 @@ refrigerant charge losses. It should be noted that this is not true for...</a>
|
|||||||
|
|
|
|
||||||
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
</p>
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
206
deploy/articles/2023/introducing-psychrometrics-cli/index.html
Normal file
206
deploy/articles/2023/introducing-psychrometrics-cli/index.html
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<meta content="#0e1112" media="(prefers-color-scheme: dark)" name="theme-color"/>
|
||||||
|
<meta content="#566B78" media="(prefers-color-scheme: light)" name="theme-color"/>
|
||||||
|
<meta content="Michael Housh" name="author"/>
|
||||||
|
<meta content="Mhoush" name="apple-mobile-web-app-title"/>
|
||||||
|
<meta content="initial-scale=1.0, width=device-width" name="viewport"/>
|
||||||
|
<meta content="telephone=no" name="format-detection"/>
|
||||||
|
<meta content="True" name="HandheldFriendly"/>
|
||||||
|
<meta content="320" name="MobileOptimized"/>
|
||||||
|
<meta content="Mhoush" name="og:site_name"/>
|
||||||
|
<meta content="hvac, developer, swift, home-performance, design" name="keywords"/>
|
||||||
|
<title>
|
||||||
|
mhoush: Introducing Psychrometrics CLI
|
||||||
|
</title>
|
||||||
|
<link href="/static/favicon.ico" rel="shortcut icon"/>
|
||||||
|
<link href="/static/output.css" rel="stylesheet"/>
|
||||||
|
<link href="/static/style.css" rel="stylesheet"/>
|
||||||
|
<link href="/articles/feed.xml" rel="alternate" title="mhoush" type="application/rss+xml"/>
|
||||||
|
<link href="/static/prism.css" rel="stylesheet"/>
|
||||||
|
<meta content="Today, I’m releasing a command line application that is built on top of my
|
||||||
|
swift-psychrometrics package, that I open sourced over 2 years ago.
|
||||||
|
The application consists of many calculations / conversions for psychrometric properties of an air stream...." name="description"/>
|
||||||
|
<meta content="summary_large_image" name="twitter:card"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-09-18-introducing-psychrometrics-cli.png" name="twitter:image"/>
|
||||||
|
<meta content="Introducing Psychrometrics CLI" name="twitter:image:alt"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images//articles/2023/introducing-psychrometrics-cli/" name="og:url"/>
|
||||||
|
<meta content="Introducing Psychrometrics CLI" name="og:title"/>
|
||||||
|
<meta content="Today, I’m releasing a command line application that is built on top of my
|
||||||
|
swift-psychrometrics package, that I open sourced over 2 years ago.
|
||||||
|
The application consists of many calculations / conversions for psychrometric properties of an air stream...." name="og:description"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-09-18-introducing-psychrometrics-cli.png" name="og:image"/>
|
||||||
|
<meta content="1014" name="og:image:width"/>
|
||||||
|
<meta content="530" name="og:image:height"/>
|
||||||
|
<script crossorigin="anonymous" src="https://kit.fontawesome.com/f209982030.js">
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body class="bg-page text-white pb-5 font-avenir articles">
|
||||||
|
<header class="bg-nav text-gray py-4 text-base/6 lg:fixed w-full lg:h-[62px]">
|
||||||
|
<nav class="container flex gap-x-5 lg:gap-x-y items-center">
|
||||||
|
<ul class="flex flex-wrap gap-x-2 lg:gap-x-5">
|
||||||
|
<li>
|
||||||
|
<a class href="/">Home</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="active" href="/articles/">Articles</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class href="/about/">About</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<div class="container pt-12 lg:pt-28">
|
||||||
|
<article class="prose">
|
||||||
|
<h1>
|
||||||
|
Introducing Psychrometrics CLI
|
||||||
|
</h1>
|
||||||
|
<div class="-mt-6">
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">September 18, 2023</span>538 words, posted in <a href="/articles/tag/hvac/">HVAC</a>, <a href="/articles/tag/psychrometrics/">psychrometrics</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<img alt="banner" src="http://localhost:3000/articles/images/2023-09-18-introducing-psychrometrics-cli.png"/>
|
||||||
|
<p>Today, I’m releasing a command line application that is built on top of my
|
||||||
|
<a href="https://github.com/swift-psychrometrics/swift-psychrometrics">swift-psychrometrics</a> package, that I open sourced over 2 years ago.</p>
|
||||||
|
<p>The application consists of many calculations / conversions for psychrometric properties of an air stream. The tool works for both imperial
|
||||||
|
and metric units. The application will work natively on macOS, but can also be ran through a <code>docker</code> container on other platforms.</p>
|
||||||
|
<h2>Why</h2>
|
||||||
|
<p>I spend a lot of time in my terminal, because I can work so much more efficiently. I discovered many years ago that the more I can do using
|
||||||
|
simple applications and keyboard over a mouse and a web browser or native application the more I can accomplish. I understand this is
|
||||||
|
intimidating for many who think they are <em>“not good with computers”.</em> I can assure that was me several years ago, I would only encourage you
|
||||||
|
to not be afraid and give it a shot. We are at a time in society where it is easier than ever to get informed and learned new skills.</p>
|
||||||
|
<h2>Installation</h2>
|
||||||
|
<p>For complete installation instructions, you can view the <a href="https://github.com/swift-psychrometrics/psychrometrics-cli">github</a> repository.</p>
|
||||||
|
<p>The following instructions are based on using macOS.</p>
|
||||||
|
<h3>Open your terminal application.</h3>
|
||||||
|
<p>Personally, I use <a href="https://iterm2.com/">iTerm2</a>, however you can use the default <code>Terminal</code> app. Found at
|
||||||
|
<code>/Applications/Utilities/Terminal.app</code>.</p>
|
||||||
|
<h2>Install Homebrew</h2>
|
||||||
|
<p>We use <a href="https://brew.sh">Homebrew</a> for package distribution of the pre-built application binaries. You can follow their instructions to
|
||||||
|
install.</p>
|
||||||
|
<h3>Tap our custom formula tap.</h3>
|
||||||
|
<pre><code class="language-bash">brew tap swift-psychrometrics/formula
|
||||||
|
</code></pre>
|
||||||
|
<h3>Install the psychrometrics application</h3>
|
||||||
|
<pre><code class="language-bash">brew install psychrometrics
|
||||||
|
</code></pre>
|
||||||
|
<p>That’s it!</p>
|
||||||
|
<h2>Usage</h2>
|
||||||
|
<p>I will run through a couple of the commands that are supplied with the application and show what you can expect the outputs to be.</p>
|
||||||
|
<h3>Properties</h3>
|
||||||
|
<p>The following command will output a bunch of the psychrometric properties of an air stream. There are several ways to call it, but generally
|
||||||
|
you will supply the dry bulb temperature and the relative humidity.</p>
|
||||||
|
<p>Below, we calculate the psychrometric properties based on 75°F and 50% humidity.</p>
|
||||||
|
<pre><code class="language-bash">psychrometrics --dry-bulb 75 --relative-humidity 50
|
||||||
|
</code></pre>
|
||||||
|
<p><img src="/articles/images/2023-09-18-properties.png" alt="properties-output" /></p>
|
||||||
|
<h3>Dehumidifier Sizing</h3>
|
||||||
|
<p>If you’ve read some of my recent articles on calculating the
|
||||||
|
<a href="https://mhoush.com/posts/sizing-dehumidifier-by-latent-load/">dehumidifier size required based on the latent load</a>, the application also
|
||||||
|
ships with a calculation that will do this for you and has the ability to calculate it at different <code>coverages</code> that you can supply.</p>
|
||||||
|
<p>For example if we’ve done a load calculation and determined that we have a latent load of <code>4,334 BTU/h</code> then we could run the following
|
||||||
|
command to see what size dehumidifier is needed for <code>100%, 85%, and 70%</code> of the latent load.</p>
|
||||||
|
<pre><code class="language-bash">psychrometrics dh size --coverage 100 85 70 --verbose 4334
|
||||||
|
</code></pre>
|
||||||
|
<p><img src="/articles/images/2023-09-18-dh-size.png" alt="dh-size" /></p>
|
||||||
|
<h3>Pounds of Water Removed</h3>
|
||||||
|
<p>I also recently wrote an article about <a href="https://mhoush.com/posts/pounds-of-water-removed/">calculating the pounds of water removed</a> from an
|
||||||
|
air stream given the grains of moisture removed.</p>
|
||||||
|
<p>Below is an example of calculating the pounds of water removed per hour based on the example in the article (14 delta-grains)</p>
|
||||||
|
<pre><code class="language-bash">psychrometrics dh pounds-removed --delta 14 --cfm 797 --verbose
|
||||||
|
</code></pre>
|
||||||
|
<p><img src="/articles/images/2023-09-18-pounds-removed.png" alt="pounds-removed" /></p>
|
||||||
|
<h3>Help</h3>
|
||||||
|
<p>You can use <code>--help</code> option to show help and the list of commands provided.</p>
|
||||||
|
<p><img src="/articles/images/2023-09-18-help.png" alt="help" /></p>
|
||||||
|
<p>If you have any questions then feel free to email or message me. I hope some of you may find this application useful.</p>
|
||||||
|
</article>
|
||||||
|
<div class="border-t border-light mt-8 pt-8">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
Written by
|
||||||
|
</h2>
|
||||||
|
<div class="flex flex-col lg:flex-row gap-8">
|
||||||
|
<div class="flex-[0_0_120px]">
|
||||||
|
<img class="w-[120px] h-[120px] rounded-full" src="/static/images/avatar.png"/>
|
||||||
|
</div>
|
||||||
|
<div class="prose">
|
||||||
|
<h3 class="!m-0">
|
||||||
|
Michael Housh
|
||||||
|
</h3>
|
||||||
|
<p class="text-gray">
|
||||||
|
HVAC business owner with over 27 years of experience. Writes articles about HVAC,
|
||||||
|
Programming, Home-Performance, and Building Science
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-16">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
More articles
|
||||||
|
</h2>
|
||||||
|
<div class="grid lg:grid-cols-2 gap-10">
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2025/vapor-htmx-todo-app/">Vapor + HTMX</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">January 05, 2025</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/programming/">programming</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
|
Build an example application using Vapor and HTMX.
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2024/free-as-in-freedom/">Free As In Freedom</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">April 09, 2024</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/open-source/">open-source</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
|
Salute to open-source software engineers
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
<p class="prose mt-8">
|
||||||
|
<a href="/articles/">› See all articles</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="site-footer container text-gray gray-links border-t border-light text-center pt-6 mt-8 text-sm">
|
||||||
|
<p>
|
||||||
|
Copyright © Michael Housh 2023-2025.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Built in Swift using
|
||||||
|
<a href="https://github.com/loopwerk/Saga" rel="nofollow" target="_blank">Saga</a>
|
||||||
|
(<a href="https://github.com/m-housh/mhoush.com" rel="nofollow" target="_blank">source</a>).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a href="http://localhost:3000/articles/feed.xml" rel="nofollow" target="_blank">RSS</a>
|
||||||
|
|
|
||||||
|
<a href="https://github.com/m-housh" rel="nofollow" target="_blank">Github</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.youtube.com/channel/UCb58SeURd5bObfTiL0KoliA" rel="nofollow" target="_blank">Youtube</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.facebook.com/michael.housh" rel="nofollow" target="_blank">Facebook</a>
|
||||||
|
|
|
||||||
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,321 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<meta content="#0e1112" media="(prefers-color-scheme: dark)" name="theme-color"/>
|
||||||
|
<meta content="#566B78" media="(prefers-color-scheme: light)" name="theme-color"/>
|
||||||
|
<meta content="Michael Housh" name="author"/>
|
||||||
|
<meta content="Mhoush" name="apple-mobile-web-app-title"/>
|
||||||
|
<meta content="initial-scale=1.0, width=device-width" name="viewport"/>
|
||||||
|
<meta content="telephone=no" name="format-detection"/>
|
||||||
|
<meta content="True" name="HandheldFriendly"/>
|
||||||
|
<meta content="320" name="MobileOptimized"/>
|
||||||
|
<meta content="Mhoush" name="og:site_name"/>
|
||||||
|
<meta content="hvac, developer, swift, home-performance, design" name="keywords"/>
|
||||||
|
<title>
|
||||||
|
mhoush: Introduction to Programming for HVAC Part-1
|
||||||
|
</title>
|
||||||
|
<link href="/static/favicon.ico" rel="shortcut icon"/>
|
||||||
|
<link href="/static/output.css" rel="stylesheet"/>
|
||||||
|
<link href="/static/style.css" rel="stylesheet"/>
|
||||||
|
<link href="/articles/feed.xml" rel="alternate" title="mhoush" type="application/rss+xml"/>
|
||||||
|
<link href="/static/prism.css" rel="stylesheet"/>
|
||||||
|
<meta content="This is part one of a series of articles to help HVAC technicians (or others) get started in developing their skills to program. This can
|
||||||
|
help to automate everyday tasks or just familiarize themselves with some of the tools used by programmers.
|
||||||
|
Why
|
||||||
|
I..." name="description"/>
|
||||||
|
<meta content="summary_large_image" name="twitter:card"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-09-21-introduction-to-programming-for-hvac-1.png" name="twitter:image"/>
|
||||||
|
<meta content="Introduction to Programming for HVAC Part-1" name="twitter:image:alt"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images//articles/2023/introduction-to-programming-for-hvac-1/" name="og:url"/>
|
||||||
|
<meta content="Introduction to Programming for HVAC Part-1" name="og:title"/>
|
||||||
|
<meta content="This is part one of a series of articles to help HVAC technicians (or others) get started in developing their skills to program. This can
|
||||||
|
help to automate everyday tasks or just familiarize themselves with some of the tools used by programmers.
|
||||||
|
Why
|
||||||
|
I..." name="og:description"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-09-21-introduction-to-programming-for-hvac-1.png" name="og:image"/>
|
||||||
|
<meta content="1014" name="og:image:width"/>
|
||||||
|
<meta content="530" name="og:image:height"/>
|
||||||
|
<script crossorigin="anonymous" src="https://kit.fontawesome.com/f209982030.js">
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body class="bg-page text-white pb-5 font-avenir articles">
|
||||||
|
<header class="bg-nav text-gray py-4 text-base/6 lg:fixed w-full lg:h-[62px]">
|
||||||
|
<nav class="container flex gap-x-5 lg:gap-x-y items-center">
|
||||||
|
<ul class="flex flex-wrap gap-x-2 lg:gap-x-5">
|
||||||
|
<li>
|
||||||
|
<a class href="/">Home</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="active" href="/articles/">Articles</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class href="/about/">About</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<div class="container pt-12 lg:pt-28">
|
||||||
|
<article class="prose">
|
||||||
|
<h1>
|
||||||
|
Introduction to Programming for HVAC Part-1
|
||||||
|
</h1>
|
||||||
|
<div class="-mt-6">
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">September 21, 2023</span>1650 words, posted in <a href="/articles/tag/hvac/">HVAC</a>, <a href="/articles/tag/programming/">programming</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<img alt="banner" src="http://localhost:3000/articles/images/2023-09-21-introduction-to-programming-for-hvac-1.png"/>
|
||||||
|
<p>This is part one of a series of articles to help HVAC technicians (or others) get started in developing their skills to program. This can
|
||||||
|
help to automate everyday tasks or just familiarize themselves with some of the tools used by programmers.</p>
|
||||||
|
<h2>Why</h2>
|
||||||
|
<p>I think if nothing else, this series can help gain knowledge, tips, and tricks to make you more comfortable with your computer. I hope that
|
||||||
|
you will at least learn how to use your <code>terminal</code> application and more specifically <code>vim</code> motions and keybindings (more on that in another
|
||||||
|
article).</p>
|
||||||
|
<p>The goal of this article is to just get a machine setup with tools and to start exploring. I am a shill for <code>macOS</code>, so all of these will be
|
||||||
|
specifically geared towards that and my workflows, most everything that is showcased should also work on <code>linux</code> machines (not sure about
|
||||||
|
<code>windows</code>), although you may have to search for specific instructions on installing software for other platforms.</p>
|
||||||
|
<p>What I have learned on my journey in programming is that the more you can lean on small software packages that focus on a single task, but
|
||||||
|
do them well, the better. The less you use your mouse, the more productive you can be. The more you can work with <code>text</code> files and formats
|
||||||
|
the more portable and transformable your workflows can be.</p>
|
||||||
|
<h2>Getting Started</h2>
|
||||||
|
<p>The first thing that we will focus on is becoming familiar with the terminal application. On macOS the terminal application is located at
|
||||||
|
<code>/Applications/Utilities/Terminal.app</code>. However, rather than click around to find it, you can use the <code>⌘<space></code> to pull up your spotlight
|
||||||
|
search, then type <code>Terminal</code> to select the terminal application.</p>
|
||||||
|
<p><img src="/articles/images/2023-09-21-spotlight.png" alt="spotlight" /></p>
|
||||||
|
<h3>Terminal Overview</h3>
|
||||||
|
<p>Your terminal is a program that allows you to run programs by typing commands into it’s window. There are a lot of built-in commands and a
|
||||||
|
bunch that you can install. The terminal is very customizable (and once familiar, you will constantly be tweaking / adjusting to suit your
|
||||||
|
needs). Right now customization is not what we will focus on, however in future articles I will provide tips and tricks on customizing it.
|
||||||
|
Right now, we only need to know how to open it up and type in commands.</p>
|
||||||
|
<p><img src="/articles/images/2023-09-21-terminal.png" alt="terminal" /></p>
|
||||||
|
<p>Below is an image / explanation of what the default status line includes.</p>
|
||||||
|
<p><img src="/articles/images/2023-09-21-terminal-line.png" alt="terminal-line" /></p>
|
||||||
|
<h3>Learn Basic Commands (Built-in)</h3>
|
||||||
|
<p>Here are a few basic commands that you should familiarize yourself with, as you will use them often when working inside of a terminal.</p>
|
||||||
|
<h3>Change Directory</h3>
|
||||||
|
<p><code>cd</code> (change directory) is the command that allows you to move around your file system when inside the terminal.</p>
|
||||||
|
<blockquote>
|
||||||
|
<p><strong>Note:</strong> <code>~</code> is a representation of your <code>Home</code> directory.</p>
|
||||||
|
</blockquote>
|
||||||
|
<pre><code class="language-bash">cd ~/Documents
|
||||||
|
</code></pre>
|
||||||
|
<p>The above command will move you into your Documents directory.</p>
|
||||||
|
<blockquote>
|
||||||
|
<p><strong>Note:</strong> If there are spaces in the name of the directory you try to move to then the easiest way is to wrap the name in quotes.</p>
|
||||||
|
</blockquote>
|
||||||
|
<pre><code class="language-bash">cd "~/Documents/Product Concepts"
|
||||||
|
</code></pre>
|
||||||
|
<p>Some other things to understand when moving around / supplying arguments to the <code>cd</code> command.</p>
|
||||||
|
<p>You can use <code>..</code> to go backwards / move up to the parent directory. For example, say we are in the <code>~/Documents</code> directory, to go back up to
|
||||||
|
the home directory we could use the following:</p>
|
||||||
|
<pre><code class="language-bash">cd ..
|
||||||
|
</code></pre>
|
||||||
|
<p>These can be chained together as well. For example say we are located in the <code>~/Documents/Product Concepts</code> directory, we could use the
|
||||||
|
following to go up two directory levels back to the home directory.</p>
|
||||||
|
<pre><code class="language-bash">cd ../..
|
||||||
|
</code></pre>
|
||||||
|
<blockquote>
|
||||||
|
<p><strong>Pro-Tip:</strong> You can use the <code><tab></code> key when navigating to auto-complete, generally typing a few characters followed with the <code><tab></code> key
|
||||||
|
will auto-complete for you.</p>
|
||||||
|
</blockquote>
|
||||||
|
<h3>List files</h3>
|
||||||
|
<p>Use <code>ls</code> to output a list of files and directories where you are located.</p>
|
||||||
|
<pre><code class="language-bash">ls
|
||||||
|
</code></pre>
|
||||||
|
<p><em>Example Output when in my ~/Documents directory</em></p>
|
||||||
|
<pre><code class="language-bash">Estimates.app
|
||||||
|
InkscapeDrawings
|
||||||
|
KwikModel
|
||||||
|
MyAparment
|
||||||
|
NCISummit
|
||||||
|
Personal
|
||||||
|
Product Concepts
|
||||||
|
Receipts.receipts
|
||||||
|
RingCentral
|
||||||
|
SketchUP
|
||||||
|
Tech-Tips
|
||||||
|
desktop.ini
|
||||||
|
espanso-migrate-backup
|
||||||
|
espanso-migrate-backup-2
|
||||||
|
</code></pre>
|
||||||
|
<p>Using options with <code>ls</code> to show more statistics and hidden files. There are often hidden files on your computer that are used for
|
||||||
|
application support or other purposes, these files are not shown using the default command. Hidden files start with a <code>.</code>, below is an
|
||||||
|
example of showing hidden files in your home directory.</p>
|
||||||
|
<pre><code class="language-bash">ls -la ~/
|
||||||
|
</code></pre>
|
||||||
|
<blockquote>
|
||||||
|
<p><strong>Note:</strong> Above I added the <code>~/</code> which will allow you to list the files in your home directory even if you currently are not there in your
|
||||||
|
terminal, if you were already there (for example by using <code>cd ~/</code> then you would not need to use that at the end of the command.</p>
|
||||||
|
</blockquote>
|
||||||
|
<p><em>Example Output</em></p>
|
||||||
|
<pre><code>total 168
|
||||||
|
drwxr-xr-x+ 46 michael staff 1472 Sep 22 10:45 .
|
||||||
|
drwxr-xr-x 6 root admin 192 Sep 22 09:08 ..
|
||||||
|
-r-------- 1 michael staff 7 Apr 8 2021 .CFUserTextEncoding
|
||||||
|
-rw-r--r--@ 1 michael staff 14340 Sep 18 10:15 .DS_Store
|
||||||
|
drwx------+ 5 michael staff 160 Sep 20 17:03 .Trash
|
||||||
|
-rw-r--r-- 1 michael staff 186 Sep 12 15:20 .actrc
|
||||||
|
drwxr-xr-x 4 michael staff 128 Dec 13 2021 .bin
|
||||||
|
drwxr-xr-x 3 michael staff 96 Mar 6 2023 .bundle
|
||||||
|
drwxr-xr-x 7 michael staff 224 Sep 12 11:40 .cabal
|
||||||
|
drwxr-xr-x 7 michael staff 224 Sep 12 15:20 .cache
|
||||||
|
drwxr-xr-x 13 michael staff 416 Aug 10 08:47 .config
|
||||||
|
drwx------ 3 michael staff 96 Jun 21 2021 .cups
|
||||||
|
drwxr-xr-x 12 michael staff 384 Sep 15 15:22 .docker
|
||||||
|
drwxr-xr-x 20 michael staff 640 Sep 19 08:11 .dotfiles
|
||||||
|
drwxr-xr-x 4 michael staff 128 Jul 26 2021 .gem
|
||||||
|
drwxr-xr-x 3 michael staff 96 Oct 11 2021 .jssc
|
||||||
|
-rw------- 1 michael staff 20 Sep 22 10:45 .lesshst
|
||||||
|
drwxr-x--- 3 michael staff 96 Mar 29 08:47 .lldb
|
||||||
|
drwxr-xr-x 8 michael staff 256 Mar 1 2023 .local
|
||||||
|
drwxr-xr-x 4 root staff 128 Apr 12 2021 .newtek
|
||||||
|
drwxr-xr-x 5 michael staff 160 Dec 13 2021 .npm
|
||||||
|
-rw------- 1 michael staff 27436 Apr 10 10:21 .psql_history
|
||||||
|
drwxr-xr-x 7 michael staff 224 Apr 18 2022 .ssh
|
||||||
|
drwxr-xr-x 6 michael staff 192 Sep 21 09:06 .swiftpm
|
||||||
|
lrwxr-xr-x 1 michael staff 25 Dec 27 2021 .tmux.conf -> .dotfiles/tmux/.tmux.conf
|
||||||
|
drwxr-xr-x 8 michael staff 256 Mar 27 16:14 .twilio-cli
|
||||||
|
drwxr-xr-x 6 michael staff 192 Sep 18 11:08 .vim
|
||||||
|
-rw------- 1 michael staff 23086 Sep 21 09:45 .viminfo
|
||||||
|
-rw-r--r-- 1 michael staff 254 Sep 21 09:32 .wget-hsts
|
||||||
|
lrwxr-xr-x 1 michael staff 43 Jan 3 2022 .zshenv -> /Users/michael/.dotfiles/zsh/config/.zshenv
|
||||||
|
drwxr-xr-x 8 michael staff 256 Dec 14 2021 AmazonWorkDocsCompanion
|
||||||
|
drwx------@ 4 michael staff 128 Dec 13 2021 Applications
|
||||||
|
lrwxr-xr-x 1 michael staff 40 Jun 6 12:00 Applications (Parallels) -> /Volumes/Bucket/Applications (Parallels)
|
||||||
|
drwx------@ 30 michael staff 960 Sep 21 08:54 Desktop
|
||||||
|
drwx------@ 19 michael staff 608 Sep 14 10:15 Documents
|
||||||
|
drwx------@ 21 michael staff 672 Sep 21 09:43 Downloads
|
||||||
|
drwx------+ 115 michael staff 3680 Sep 14 10:04 Library
|
||||||
|
drwxr-xr-x 3 michael staff 96 Sep 8 13:06 LocalProjects
|
||||||
|
lrwxr-xr-x 1 michael staff 29 Dec 30 2021 Movies -> /Volumes/Bucket/Videos/Movies
|
||||||
|
lrwxr-xr-x 1 michael staff 21 Dec 30 2021 Music -> /Volumes/Bucket/Music
|
||||||
|
drwx------@ 2 michael staff 64 Mar 6 2023 Parallels
|
||||||
|
drwx------@ 7 michael staff 224 Sep 14 09:52 Pictures
|
||||||
|
drwxr-x---+ 4 michael staff 128 Apr 8 2021 Public
|
||||||
|
drwxr-xr-x+ 3 michael staff 96 Sep 14 09:52 Sites
|
||||||
|
drwxr-xr-x 3 michael staff 96 Jun 7 2021 WorkDocs Drive
|
||||||
|
drwxr-xr-x 3 michael staff 96 Sep 18 11:36 go
|
||||||
|
</code></pre>
|
||||||
|
<p>As you can see, I have a lot of hidden files and folders, your output will probably look much different than mine.</p>
|
||||||
|
<h3>Clearing the Terminal</h3>
|
||||||
|
<p>Often times you may want to clear the terminal screen. You can use the <code>clear</code> command to clear the screen of the terminal.</p>
|
||||||
|
<pre><code class="language-bash">clear
|
||||||
|
</code></pre>
|
||||||
|
<p>Or use a keyboard shortcut <code>⌃l</code> (<code><control>l</code>)</p>
|
||||||
|
<h3>Creating Directories</h3>
|
||||||
|
<p>Use <code>mkdir</code> (make directory) to create a directory.</p>
|
||||||
|
<p>First, let’s move into the <code>tmp</code> directory, the <code>tmp</code> directory is a directory on your file system that is typically used for applications
|
||||||
|
to write temporary logs / files to, it get’s erased everytime your computer is restarted. We can use the <code>cd</code> command that we learned
|
||||||
|
earlier.</p>
|
||||||
|
<pre><code class="language-bash">cd /tmp
|
||||||
|
</code></pre>
|
||||||
|
<p>Next, let’s create a new directory called “MyDirectory”.</p>
|
||||||
|
<pre><code class="language-bash">mkdir MyDirectory
|
||||||
|
</code></pre>
|
||||||
|
<h4>Gotcha’s with ‘mkdir’</h4>
|
||||||
|
<p>By default you can’t create directories that are multiple levels deep, unless the directories already existed or we provide the <code>-p</code> option.
|
||||||
|
For example, if we want to create a directory at <code>/tmp/MyOtherDirectory/Nested/Deeply</code> then we could use the following command when inside
|
||||||
|
the <code>tmp</code> directory.</p>
|
||||||
|
<pre><code class="language-bash">mkdir -p MyOtherDirectory/Nested/Deeply
|
||||||
|
</code></pre>
|
||||||
|
<p>Now, try out using the <code><tab></code> key with the <code>cd</code> command to navigate to the <code>Deeply</code> folder.</p>
|
||||||
|
<pre><code class="language-bash">cd MyOther <tab> <tab> <tab>
|
||||||
|
</code></pre>
|
||||||
|
<h3>Open Command</h3>
|
||||||
|
<p>You can use the open command to open files or folders in the default application for the file type.</p>
|
||||||
|
<p>For example, if we want to open a <code>Finder</code> window while in the <code>/tmp</code> directory, we can use the following command:</p>
|
||||||
|
<pre><code class="language-bash">open .
|
||||||
|
</code></pre>
|
||||||
|
<h3>Manual Pages</h3>
|
||||||
|
<p>Lastly, to learn more about commands you can use the <code>man <command></code>. To bring up the manual pages for the command in the terminal. You can
|
||||||
|
use the arrow keys to navigate around the manual pages and type the letter <code>q</code> to quit / close the manual pages.</p>
|
||||||
|
<pre><code class="language-bash">man ls
|
||||||
|
</code></pre>
|
||||||
|
<p>That is it for the first installment in this series. I hope you learned something and have better understanding of using your terminal.</p>
|
||||||
|
</article>
|
||||||
|
<div class="border-t border-light mt-8 pt-8">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
Written by
|
||||||
|
</h2>
|
||||||
|
<div class="flex flex-col lg:flex-row gap-8">
|
||||||
|
<div class="flex-[0_0_120px]">
|
||||||
|
<img class="w-[120px] h-[120px] rounded-full" src="/static/images/avatar.png"/>
|
||||||
|
</div>
|
||||||
|
<div class="prose">
|
||||||
|
<h3 class="!m-0">
|
||||||
|
Michael Housh
|
||||||
|
</h3>
|
||||||
|
<p class="text-gray">
|
||||||
|
HVAC business owner with over 27 years of experience. Writes articles about HVAC,
|
||||||
|
Programming, Home-Performance, and Building Science
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-16">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
More articles
|
||||||
|
</h2>
|
||||||
|
<div class="grid lg:grid-cols-2 gap-10">
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2025/vapor-htmx-todo-app/">Vapor + HTMX</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">January 05, 2025</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/programming/">programming</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
|
Build an example application using Vapor and HTMX.
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2024/free-as-in-freedom/">Free As In Freedom</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">April 09, 2024</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/open-source/">open-source</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
|
Salute to open-source software engineers
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
<p class="prose mt-8">
|
||||||
|
<a href="/articles/">› See all articles</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="site-footer container text-gray gray-links border-t border-light text-center pt-6 mt-8 text-sm">
|
||||||
|
<p>
|
||||||
|
Copyright © Michael Housh 2023-2025.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Built in Swift using
|
||||||
|
<a href="https://github.com/loopwerk/Saga" rel="nofollow" target="_blank">Saga</a>
|
||||||
|
(<a href="https://github.com/m-housh/mhoush.com" rel="nofollow" target="_blank">source</a>).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a href="http://localhost:3000/articles/feed.xml" rel="nofollow" target="_blank">RSS</a>
|
||||||
|
|
|
||||||
|
<a href="https://github.com/m-housh" rel="nofollow" target="_blank">Github</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.youtube.com/channel/UCb58SeURd5bObfTiL0KoliA" rel="nofollow" target="_blank">Youtube</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.facebook.com/michael.housh" rel="nofollow" target="_blank">Facebook</a>
|
||||||
|
|
|
||||||
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,214 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<meta content="#0e1112" media="(prefers-color-scheme: dark)" name="theme-color"/>
|
||||||
|
<meta content="#566B78" media="(prefers-color-scheme: light)" name="theme-color"/>
|
||||||
|
<meta content="Michael Housh" name="author"/>
|
||||||
|
<meta content="Mhoush" name="apple-mobile-web-app-title"/>
|
||||||
|
<meta content="initial-scale=1.0, width=device-width" name="viewport"/>
|
||||||
|
<meta content="telephone=no" name="format-detection"/>
|
||||||
|
<meta content="True" name="HandheldFriendly"/>
|
||||||
|
<meta content="320" name="MobileOptimized"/>
|
||||||
|
<meta content="Mhoush" name="og:site_name"/>
|
||||||
|
<meta content="hvac, developer, swift, home-performance, design" name="keywords"/>
|
||||||
|
<title>
|
||||||
|
mhoush: Introduction to Programming for HVAC Part-2
|
||||||
|
</title>
|
||||||
|
<link href="/static/favicon.ico" rel="shortcut icon"/>
|
||||||
|
<link href="/static/output.css" rel="stylesheet"/>
|
||||||
|
<link href="/static/style.css" rel="stylesheet"/>
|
||||||
|
<link href="/articles/feed.xml" rel="alternate" title="mhoush" type="application/rss+xml"/>
|
||||||
|
<link href="/static/prism.css" rel="stylesheet"/>
|
||||||
|
<meta content="In this article, learn about installing a package manager. If you missed it, check out the
|
||||||
|
first article in the series where we learned about using your terminal.
|
||||||
|
This article builds upon that foundation.
|
||||||
|
What is a Package Manager
|
||||||
|
A package manager..." name="description"/>
|
||||||
|
<meta content="summary_large_image" name="twitter:card"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-09-22-introduction-to-programming-for-hvac-2.png" name="twitter:image"/>
|
||||||
|
<meta content="Introduction to Programming for HVAC Part-2" name="twitter:image:alt"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images//articles/2023/introduction-to-programming-for-hvac-2/" name="og:url"/>
|
||||||
|
<meta content="Introduction to Programming for HVAC Part-2" name="og:title"/>
|
||||||
|
<meta content="In this article, learn about installing a package manager. If you missed it, check out the
|
||||||
|
first article in the series where we learned about using your terminal.
|
||||||
|
This article builds upon that foundation.
|
||||||
|
What is a Package Manager
|
||||||
|
A package manager..." name="og:description"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-09-22-introduction-to-programming-for-hvac-2.png" name="og:image"/>
|
||||||
|
<meta content="1014" name="og:image:width"/>
|
||||||
|
<meta content="530" name="og:image:height"/>
|
||||||
|
<script crossorigin="anonymous" src="https://kit.fontawesome.com/f209982030.js">
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body class="bg-page text-white pb-5 font-avenir articles">
|
||||||
|
<header class="bg-nav text-gray py-4 text-base/6 lg:fixed w-full lg:h-[62px]">
|
||||||
|
<nav class="container flex gap-x-5 lg:gap-x-y items-center">
|
||||||
|
<ul class="flex flex-wrap gap-x-2 lg:gap-x-5">
|
||||||
|
<li>
|
||||||
|
<a class href="/">Home</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="active" href="/articles/">Articles</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class href="/about/">About</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<div class="container pt-12 lg:pt-28">
|
||||||
|
<article class="prose">
|
||||||
|
<h1>
|
||||||
|
Introduction to Programming for HVAC Part-2
|
||||||
|
</h1>
|
||||||
|
<div class="-mt-6">
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">September 22, 2023</span>537 words, posted in <a href="/articles/tag/hvac/">HVAC</a>, <a href="/articles/tag/programming/">programming</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<img alt="banner" src="http://localhost:3000/articles/images/2023-09-22-introduction-to-programming-for-hvac-2.png"/>
|
||||||
|
<p>In this article, learn about installing a package manager. If you missed it, check out the
|
||||||
|
<a href="https://mhoush.com/posts/introduction-to-programming-for-hvac-1/">first</a> article in the series where we learned about using your terminal.
|
||||||
|
This article builds upon that foundation.</p>
|
||||||
|
<h2>What is a Package Manager</h2>
|
||||||
|
<p>A package manager is a piece of software that helps to install software and manage updates for your system. For me, the first thing that I
|
||||||
|
do with a new machine is install <code>Homebrew</code>. <a href="https://brew.sh">Homebrew</a> is my preferred package manager for <code>macOS</code>.</p>
|
||||||
|
<h2>Why</h2>
|
||||||
|
<p>A package manager is nice because often software relies / requires other dependencies in order to work properly. By using a package manager
|
||||||
|
it will make sure that the correct dependencies are installed for the software that you need to run. It allows you to be able to update and
|
||||||
|
manage software through a centralized interface.</p>
|
||||||
|
<h2>Installation</h2>
|
||||||
|
<p>Installation is simple. Open up your terminal and enter the following command (easiest to just copy / paste from the homepage linked above).</p>
|
||||||
|
<pre><code class="language-bash">/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||||||
|
</code></pre>
|
||||||
|
<p>This will prompt you for your password in order to create some directories and install the required software for <code>brew</code> to work. The
|
||||||
|
installation may take some time, while it downloads the command line tools for <code>Xcode</code>.</p>
|
||||||
|
<p>When completed, follow the <code>Next Steps</code> and copy / paste the command listed, that should look like below.</p>
|
||||||
|
<pre><code class="language-bash">(echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/<you>/.zprofile
|
||||||
|
eval "$(/opt/homebrew/bin/brew shellenv)"
|
||||||
|
</code></pre>
|
||||||
|
<p><img src="/articles/images/2023-09-22-brew-output.png" alt="brew-output" /></p>
|
||||||
|
<p>The first line of this command sets up some things in your shell profile (which we have not discussed yet) that will make <code>Homebrew</code>
|
||||||
|
available to you anytime you start a new session in your terminal. The second line of the command makes it available in your current
|
||||||
|
terminal session.</p>
|
||||||
|
<p>Next run the following command and make sure that everything is setup correctly.</p>
|
||||||
|
<pre><code class="language-bash">brew doctor
|
||||||
|
</code></pre>
|
||||||
|
<p>Which should output the following:</p>
|
||||||
|
<pre><code>Your system is ready to brew.
|
||||||
|
</code></pre>
|
||||||
|
<h3>Terminology</h3>
|
||||||
|
<p>Homebrew calls command line applications <code>formula</code> and normal graphical applications <code>casks</code>. It has the ability to install both styles of
|
||||||
|
applications.</p>
|
||||||
|
<h2>Search Command</h2>
|
||||||
|
<p>The following command is used to search for software packages:</p>
|
||||||
|
<pre><code class="language-bash">brew search chrome
|
||||||
|
</code></pre>
|
||||||
|
<h2>Open a Homepage</h2>
|
||||||
|
<p>The following command can be used to view the homepage of a formula or cask in your browser:</p>
|
||||||
|
<pre><code class="language-bash">brew home google-chrome
|
||||||
|
</code></pre>
|
||||||
|
<h2>Update Homebrew</h2>
|
||||||
|
<p>The following command is used to update homebrew:</p>
|
||||||
|
<pre><code class="language-bash">brew update
|
||||||
|
</code></pre>
|
||||||
|
<h2>Update packages installed on your system</h2>
|
||||||
|
<p>The following command is used to update software that is installed / managed by homebrew.</p>
|
||||||
|
<pre><code class="language-bash">brew upgrade
|
||||||
|
</code></pre>
|
||||||
|
<p>You can combine the update and upgrade commands, which will update homebrew and upgrade all the software it manages on you machine with the
|
||||||
|
following command.</p>
|
||||||
|
<pre><code class="language-bash">brew update && brew upgrade
|
||||||
|
</code></pre>
|
||||||
|
<h2>Conclusion</h2>
|
||||||
|
<p>That is it for this article. I will say that for me, when I find a piece of software that I want to use, I generally try to search for it in
|
||||||
|
<code>brew</code> first, before installing it via other means.</p>
|
||||||
|
<p>I hope you’ve found this article helpful. In the next article we will start to use the skills that we’ve learned in these first two articles
|
||||||
|
and write our first program / script.</p>
|
||||||
|
</article>
|
||||||
|
<div class="border-t border-light mt-8 pt-8">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
Written by
|
||||||
|
</h2>
|
||||||
|
<div class="flex flex-col lg:flex-row gap-8">
|
||||||
|
<div class="flex-[0_0_120px]">
|
||||||
|
<img class="w-[120px] h-[120px] rounded-full" src="/static/images/avatar.png"/>
|
||||||
|
</div>
|
||||||
|
<div class="prose">
|
||||||
|
<h3 class="!m-0">
|
||||||
|
Michael Housh
|
||||||
|
</h3>
|
||||||
|
<p class="text-gray">
|
||||||
|
HVAC business owner with over 27 years of experience. Writes articles about HVAC,
|
||||||
|
Programming, Home-Performance, and Building Science
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-16">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
More articles
|
||||||
|
</h2>
|
||||||
|
<div class="grid lg:grid-cols-2 gap-10">
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2025/vapor-htmx-todo-app/">Vapor + HTMX</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">January 05, 2025</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/programming/">programming</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
|
Build an example application using Vapor and HTMX.
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2024/free-as-in-freedom/">Free As In Freedom</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">April 09, 2024</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/open-source/">open-source</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
|
Salute to open-source software engineers
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
<p class="prose mt-8">
|
||||||
|
<a href="/articles/">› See all articles</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="site-footer container text-gray gray-links border-t border-light text-center pt-6 mt-8 text-sm">
|
||||||
|
<p>
|
||||||
|
Copyright © Michael Housh 2023-2025.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Built in Swift using
|
||||||
|
<a href="https://github.com/loopwerk/Saga" rel="nofollow" target="_blank">Saga</a>
|
||||||
|
(<a href="https://github.com/m-housh/mhoush.com" rel="nofollow" target="_blank">source</a>).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a href="http://localhost:3000/articles/feed.xml" rel="nofollow" target="_blank">RSS</a>
|
||||||
|
|
|
||||||
|
<a href="https://github.com/m-housh" rel="nofollow" target="_blank">Github</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.youtube.com/channel/UCb58SeURd5bObfTiL0KoliA" rel="nofollow" target="_blank">Youtube</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.facebook.com/michael.housh" rel="nofollow" target="_blank">Facebook</a>
|
||||||
|
|
|
||||||
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,228 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<meta content="#0e1112" media="(prefers-color-scheme: dark)" name="theme-color"/>
|
||||||
|
<meta content="#566B78" media="(prefers-color-scheme: light)" name="theme-color"/>
|
||||||
|
<meta content="Michael Housh" name="author"/>
|
||||||
|
<meta content="Mhoush" name="apple-mobile-web-app-title"/>
|
||||||
|
<meta content="initial-scale=1.0, width=device-width" name="viewport"/>
|
||||||
|
<meta content="telephone=no" name="format-detection"/>
|
||||||
|
<meta content="True" name="HandheldFriendly"/>
|
||||||
|
<meta content="320" name="MobileOptimized"/>
|
||||||
|
<meta content="Mhoush" name="og:site_name"/>
|
||||||
|
<meta content="hvac, developer, swift, home-performance, design" name="keywords"/>
|
||||||
|
<title>
|
||||||
|
mhoush: Introduction to Programming for HVAC Part-3
|
||||||
|
</title>
|
||||||
|
<link href="/static/favicon.ico" rel="shortcut icon"/>
|
||||||
|
<link href="/static/output.css" rel="stylesheet"/>
|
||||||
|
<link href="/static/style.css" rel="stylesheet"/>
|
||||||
|
<link href="/articles/feed.xml" rel="alternate" title="mhoush" type="application/rss+xml"/>
|
||||||
|
<link href="/static/prism.css" rel="stylesheet"/>
|
||||||
|
<meta content="In this article we will put together some of the pieces from the last 2 articles, and build our first program. If you have missed the first
|
||||||
|
articles, then you can catch up here before continuing with this article.
|
||||||
|
Getting Started
|
||||||
|
We are going to make..." name="description"/>
|
||||||
|
<meta content="summary_large_image" name="twitter:card"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-09-24-introduction-to-programming-for-hvac-3.png" name="twitter:image"/>
|
||||||
|
<meta content="Introduction to Programming for HVAC Part-3" name="twitter:image:alt"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images//articles/2023/introduction-to-programming-for-hvac-3/" name="og:url"/>
|
||||||
|
<meta content="Introduction to Programming for HVAC Part-3" name="og:title"/>
|
||||||
|
<meta content="In this article we will put together some of the pieces from the last 2 articles, and build our first program. If you have missed the first
|
||||||
|
articles, then you can catch up here before continuing with this article.
|
||||||
|
Getting Started
|
||||||
|
We are going to make..." name="og:description"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-09-24-introduction-to-programming-for-hvac-3.png" name="og:image"/>
|
||||||
|
<meta content="1014" name="og:image:width"/>
|
||||||
|
<meta content="530" name="og:image:height"/>
|
||||||
|
<script crossorigin="anonymous" src="https://kit.fontawesome.com/f209982030.js">
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body class="bg-page text-white pb-5 font-avenir articles">
|
||||||
|
<header class="bg-nav text-gray py-4 text-base/6 lg:fixed w-full lg:h-[62px]">
|
||||||
|
<nav class="container flex gap-x-5 lg:gap-x-y items-center">
|
||||||
|
<ul class="flex flex-wrap gap-x-2 lg:gap-x-5">
|
||||||
|
<li>
|
||||||
|
<a class href="/">Home</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="active" href="/articles/">Articles</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class href="/about/">About</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<div class="container pt-12 lg:pt-28">
|
||||||
|
<article class="prose">
|
||||||
|
<h1>
|
||||||
|
Introduction to Programming for HVAC Part-3
|
||||||
|
</h1>
|
||||||
|
<div class="-mt-6">
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">September 24, 2023</span>742 words, posted in <a href="/articles/tag/hvac/">HVAC</a>, <a href="/articles/tag/programming/">programming</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<img alt="banner" src="http://localhost:3000/articles/images/2023-09-24-introduction-to-programming-for-hvac-3.png"/>
|
||||||
|
<p>In this article we will put together some of the pieces from the last 2 articles, and build our first program. If you have missed the first
|
||||||
|
articles, then you can catch up <a href="https://mhoush.com/series/programming-for-hvac/">here</a> before continuing with this article.</p>
|
||||||
|
<h2>Getting Started</h2>
|
||||||
|
<p>We are going to make our first script / program. This first program is really just setting up some building blocks for our next program we
|
||||||
|
will write, that will remove the background from an image.</p>
|
||||||
|
<h3>Creating a scripts directory</h3>
|
||||||
|
<p>We learned in the <a href="https://mhoush.com/posts/introduction-to-programming-for-hvac-1/">first article</a> how to use our terminal. Today we are
|
||||||
|
going to use some of the commands we learned to create a directory where we can store our script and future scripts that we write.</p>
|
||||||
|
<p><strong>Create a directory</strong></p>
|
||||||
|
<pre><code class="language-bash">mkdir -p ~/.local/bin
|
||||||
|
</code></pre>
|
||||||
|
<p>The above command will create a “hidden” directory in your home folder. We can go ahead and move into the directory we just created.</p>
|
||||||
|
<blockquote>
|
||||||
|
<p><strong>Note:</strong> The <code>-p</code> option allows us to create nested directories if the parent directory doesn’t exist.</p>
|
||||||
|
</blockquote>
|
||||||
|
<pre><code class="language-bash">cd ~/.local/bin
|
||||||
|
</code></pre>
|
||||||
|
<h3>Hello World</h3>
|
||||||
|
<p>It is common in programming to start out with a “Hello World” program when learning a new scripting paradigm. So let’s jump in and get
|
||||||
|
started.</p>
|
||||||
|
<p><strong>Creating our script file:</strong></p>
|
||||||
|
<pre><code class="language-bash">touch hello-world.sh
|
||||||
|
</code></pre>
|
||||||
|
<p><strong>Now open the file:</strong></p>
|
||||||
|
<pre><code class="language-bash">open hello-world.sh
|
||||||
|
</code></pre>
|
||||||
|
<p>The above command should open the file in the <code>TextEdit</code> application. In order to make the text edit application to not auto-capitalize
|
||||||
|
words and play more nicely, we need to adjust some settings. Open the settings by pressing <code>⌘,</code>.</p>
|
||||||
|
<p>In the <strong>Format</strong> section, select <em>Plain text</em> and in the <strong>Options</strong> section de-select <em>Check spelling as you type</em>.</p>
|
||||||
|
<p><img src="/articles/images/2023-09-24-text-settings.png" alt="text-settings" /></p>
|
||||||
|
<p>At this point for changes to take place, you will need to close the file and re-open.</p>
|
||||||
|
<blockquote>
|
||||||
|
<p><strong>Tip:</strong> In your terminal you can run the last command in your history by using the <code>↑</code> (Up) arrow key.</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>Now that the file is open again, we will write our hello-world program. The contents of your file should look like the following:</p>
|
||||||
|
<pre><code class="language-bash">#!/bin/sh
|
||||||
|
|
||||||
|
echo 'Hello World!'
|
||||||
|
</code></pre>
|
||||||
|
<p>The first line is referred to as the <code>shebang</code>, this tells your computer which shell interperter to run your file. I have not explained the
|
||||||
|
shell yet, but it currently would just muddy the waters a bit, but there are several shell interperters on your computer with the <code>sh</code> posix
|
||||||
|
shell being one of the most universal / lowest level ones, which is why I’m choosing this one (in other words this script would work on just
|
||||||
|
about any machine you were on).</p>
|
||||||
|
<p>The second line we are using the built-in <code>echo</code> command and passing it the ‘Hello World!’ argument.</p>
|
||||||
|
<p>Now save and close the file <code>⌘s</code> (to save) <code>⌘q</code> (to quit the text edit application).</p>
|
||||||
|
<p><strong>Run the program from your terminal:</strong></p>
|
||||||
|
<pre><code class="language-bash">/bin/sh hello-world.sh
|
||||||
|
</code></pre>
|
||||||
|
<p>You should see that <code>Hello World!</code> was printed to your console.</p>
|
||||||
|
<p><img src="/articles/images/2023-09-24-hello-output.png" alt="hello-output" /></p>
|
||||||
|
<h3>Make Executable</h3>
|
||||||
|
<p>Now that we have our basic script working, let’s make it an executable.</p>
|
||||||
|
<p><strong>In your terminal, type the following:</strong></p>
|
||||||
|
<pre><code class="language-bash">chmod u+x hello-world.sh
|
||||||
|
</code></pre>
|
||||||
|
<p>This will change the mode of the file type to be an executable.</p>
|
||||||
|
<p>Now move / rename the file so we don’t have to call it using <code>.sh</code> extension:</p>
|
||||||
|
<pre><code class="language-bash">mv hello-world.sh hello-world
|
||||||
|
</code></pre>
|
||||||
|
<p>Now that the file is executable, we can execute it by just calling the name of the file.</p>
|
||||||
|
<pre><code class="language-bash">./hello-world
|
||||||
|
</code></pre>
|
||||||
|
<blockquote>
|
||||||
|
<p><strong>Note:</strong> We have to prefix the file name with <code>./</code> in the above command so that it knows where to find our file. The <code>./</code> is saying run
|
||||||
|
this file in our current directory. In the future we will setup our shell so that it knows to look in our <code>~/.local/bin</code> directory for
|
||||||
|
scripts, so that we can call them without this prefix.</p>
|
||||||
|
</blockquote>
|
||||||
|
<h2>Conclusion</h2>
|
||||||
|
<p>Congratulations, in this article we wrote our first program. We learned how to edit the file, set it’s permissions, and execute the program
|
||||||
|
from our terminal. I should mention that the <code>TextEdit</code> application is generally not how you would program, people typically use what is
|
||||||
|
known as an <code>IDE (integrated development environment)</code>, however I chose to use the <code>TextEdit</code> application because it is built-in to <code>macOS</code>
|
||||||
|
and allowed us to accomplish our goal without downloading other software.</p>
|
||||||
|
<p>In our upcoming articles, we will write a program that I hope is useful to you / something that you can build upon and use for a long time.
|
||||||
|
Thank you for reading to this point.</p>
|
||||||
|
</article>
|
||||||
|
<div class="border-t border-light mt-8 pt-8">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
Written by
|
||||||
|
</h2>
|
||||||
|
<div class="flex flex-col lg:flex-row gap-8">
|
||||||
|
<div class="flex-[0_0_120px]">
|
||||||
|
<img class="w-[120px] h-[120px] rounded-full" src="/static/images/avatar.png"/>
|
||||||
|
</div>
|
||||||
|
<div class="prose">
|
||||||
|
<h3 class="!m-0">
|
||||||
|
Michael Housh
|
||||||
|
</h3>
|
||||||
|
<p class="text-gray">
|
||||||
|
HVAC business owner with over 27 years of experience. Writes articles about HVAC,
|
||||||
|
Programming, Home-Performance, and Building Science
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-16">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
More articles
|
||||||
|
</h2>
|
||||||
|
<div class="grid lg:grid-cols-2 gap-10">
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2025/vapor-htmx-todo-app/">Vapor + HTMX</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">January 05, 2025</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/programming/">programming</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
|
Build an example application using Vapor and HTMX.
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2024/free-as-in-freedom/">Free As In Freedom</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">April 09, 2024</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/open-source/">open-source</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
|
Salute to open-source software engineers
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
<p class="prose mt-8">
|
||||||
|
<a href="/articles/">› See all articles</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="site-footer container text-gray gray-links border-t border-light text-center pt-6 mt-8 text-sm">
|
||||||
|
<p>
|
||||||
|
Copyright © Michael Housh 2023-2025.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Built in Swift using
|
||||||
|
<a href="https://github.com/loopwerk/Saga" rel="nofollow" target="_blank">Saga</a>
|
||||||
|
(<a href="https://github.com/m-housh/mhoush.com" rel="nofollow" target="_blank">source</a>).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a href="http://localhost:3000/articles/feed.xml" rel="nofollow" target="_blank">RSS</a>
|
||||||
|
|
|
||||||
|
<a href="https://github.com/m-housh" rel="nofollow" target="_blank">Github</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.youtube.com/channel/UCb58SeURd5bObfTiL0KoliA" rel="nofollow" target="_blank">Youtube</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.facebook.com/michael.housh" rel="nofollow" target="_blank">Facebook</a>
|
||||||
|
|
|
||||||
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,294 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<meta content="#0e1112" media="(prefers-color-scheme: dark)" name="theme-color"/>
|
||||||
|
<meta content="#566B78" media="(prefers-color-scheme: light)" name="theme-color"/>
|
||||||
|
<meta content="Michael Housh" name="author"/>
|
||||||
|
<meta content="Mhoush" name="apple-mobile-web-app-title"/>
|
||||||
|
<meta content="initial-scale=1.0, width=device-width" name="viewport"/>
|
||||||
|
<meta content="telephone=no" name="format-detection"/>
|
||||||
|
<meta content="True" name="HandheldFriendly"/>
|
||||||
|
<meta content="320" name="MobileOptimized"/>
|
||||||
|
<meta content="Mhoush" name="og:site_name"/>
|
||||||
|
<meta content="hvac, developer, swift, home-performance, design" name="keywords"/>
|
||||||
|
<title>
|
||||||
|
mhoush: Introduction to Programming for HVAC Part-4
|
||||||
|
</title>
|
||||||
|
<link href="/static/favicon.ico" rel="shortcut icon"/>
|
||||||
|
<link href="/static/output.css" rel="stylesheet"/>
|
||||||
|
<link href="/static/style.css" rel="stylesheet"/>
|
||||||
|
<link href="/articles/feed.xml" rel="alternate" title="mhoush" type="application/rss+xml"/>
|
||||||
|
<link href="/static/prism.css" rel="stylesheet"/>
|
||||||
|
<meta content="This article builds upon our last 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..." name="description"/>
|
||||||
|
<meta content="summary_large_image" name="twitter:card"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-09-26-introduction-to-programming-for-hvac-4.png" name="twitter:image"/>
|
||||||
|
<meta content="Introduction to Programming for HVAC Part-4" name="twitter:image:alt"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images//articles/2023/introduction-to-programming-for-hvac-4/" name="og:url"/>
|
||||||
|
<meta content="Introduction to Programming for HVAC Part-4" name="og:title"/>
|
||||||
|
<meta content="This article builds upon our last 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..." name="og:description"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-09-26-introduction-to-programming-for-hvac-4.png" name="og:image"/>
|
||||||
|
<meta content="1014" name="og:image:width"/>
|
||||||
|
<meta content="530" name="og:image:height"/>
|
||||||
|
<script crossorigin="anonymous" src="https://kit.fontawesome.com/f209982030.js">
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body class="bg-page text-white pb-5 font-avenir articles">
|
||||||
|
<header class="bg-nav text-gray py-4 text-base/6 lg:fixed w-full lg:h-[62px]">
|
||||||
|
<nav class="container flex gap-x-5 lg:gap-x-y items-center">
|
||||||
|
<ul class="flex flex-wrap gap-x-2 lg:gap-x-5">
|
||||||
|
<li>
|
||||||
|
<a class href="/">Home</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="active" href="/articles/">Articles</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class href="/about/">About</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<div class="container pt-12 lg:pt-28">
|
||||||
|
<article class="prose">
|
||||||
|
<h1>
|
||||||
|
Introduction to Programming for HVAC Part-4
|
||||||
|
</h1>
|
||||||
|
<div class="-mt-6">
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">September 26, 2023</span>1159 words, posted in <a href="/articles/tag/hvac/">HVAC</a>, <a href="/articles/tag/programming/">programming</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<img alt="banner" src="http://localhost:3000/articles/images/2023-09-26-introduction-to-programming-for-hvac-4.png"/>
|
||||||
|
<p>This article builds upon our <a href="https://mhoush.com/posts/introduction-to-programming-for-hvac-3/">last</a> article, so make sure to catch up
|
||||||
|
before continuing with this article.</p>
|
||||||
|
<h2>Arguments</h2>
|
||||||
|
<p>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 <code>" "</code>, as opposed to options which start with a <code>-<character></code> or <code>--<word></code>.</p>
|
||||||
|
<p>To illustrate this, let’s change our <code>hello-world</code> script we wrote in the last article.</p>
|
||||||
|
<p><strong>Move into our scripts directory:</strong></p>
|
||||||
|
<pre><code class="language-bash">cd ~/.local/bin
|
||||||
|
</code></pre>
|
||||||
|
<p><strong>Make a copy of the hello-world script:</strong></p>
|
||||||
|
<pre><code class="language-bash">cp hello-world greet
|
||||||
|
</code></pre>
|
||||||
|
<p>Above we make a copy of the hello-world file and name the copy <code>greet</code>.</p>
|
||||||
|
<p><strong>Open the greet file:</strong></p>
|
||||||
|
<pre><code class="language-bash">open -a TextEdit greet
|
||||||
|
</code></pre>
|
||||||
|
<blockquote>
|
||||||
|
<p><strong>Note:</strong> Because the greet file is an executable, in order to open it in the <code>TextEdit</code> application we must supply the <code>-a</code> option.
|
||||||
|
Otherwise it will just run our <code>greet</code> program in another terminal. Use <code>man open</code> to read more about the open command.</p>
|
||||||
|
</blockquote>
|
||||||
|
<p><strong>Edit the greet file:</strong></p>
|
||||||
|
<pre><code class="language-bash">#!/bin/sh
|
||||||
|
|
||||||
|
echo "Hello, ${1}!"
|
||||||
|
</code></pre>
|
||||||
|
<p>Make sure to save <code>⌘s</code> the file.</p>
|
||||||
|
<p>Take note that the quotes need to be changed to <code>"</code> (double quotes) from our original <code>hello-world</code> program.</p>
|
||||||
|
<p>The <code>${1}</code> 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 <code>${0}</code> always representing the filename of the program that is called (generally not needed
|
||||||
|
/ used in your scripts).</p>
|
||||||
|
<p><strong>Test it out:</strong></p>
|
||||||
|
<pre><code class="language-bash">./greet Michael
|
||||||
|
</code></pre>
|
||||||
|
<p><img src="/articles/images/2023-09-26-greet-output.png" alt="greet-output" /></p>
|
||||||
|
<p>If you’d like to supply multiple words (or arguments that contain spaces) as a single argument then you can wrap them in quotes.</p>
|
||||||
|
<pre><code class="language-bash">./greet "Michael Housh"
|
||||||
|
</code></pre>
|
||||||
|
<blockquote>
|
||||||
|
<p><strong>Tip:</strong> Wrapping in quotes is especially useful for commands that take file paths, if any of the folders or file names contain spaces.</p>
|
||||||
|
</blockquote>
|
||||||
|
<h2>More Useful Program</h2>
|
||||||
|
<p>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.</p>
|
||||||
|
<p><strong>Install imagemagick:</strong></p>
|
||||||
|
<pre><code class="language-bash">brew install imagemagick
|
||||||
|
</code></pre>
|
||||||
|
<blockquote>
|
||||||
|
<p><strong>Note:</strong> If you’d like to check out the documentation / website for imagemagick you can run <code>brew home imagemagick</code>.</p>
|
||||||
|
</blockquote>
|
||||||
|
<p>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.</p>
|
||||||
|
<pre><code class="language-bash">magick --version
|
||||||
|
</code></pre>
|
||||||
|
<p>It should output something along the lines of this below.</p>
|
||||||
|
<pre><code class="language-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)
|
||||||
|
</code></pre>
|
||||||
|
<blockquote>
|
||||||
|
<p><strong>Tip:</strong> Don’t forget, you can use the <code>clear</code> command to clear the terminal.</p>
|
||||||
|
</blockquote>
|
||||||
|
<p><strong>Create our script:</strong></p>
|
||||||
|
<pre><code class="language-bash">touch mktrans
|
||||||
|
</code></pre>
|
||||||
|
<p>We are going to name our script <code>mktrans</code> as a short for make transparent.</p>
|
||||||
|
<p><strong>Open the file:</strong></p>
|
||||||
|
<pre><code class="language-bash">open mktrans
|
||||||
|
</code></pre>
|
||||||
|
<p><strong>The program:</strong></p>
|
||||||
|
<pre><code class="language-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}"
|
||||||
|
|
||||||
|
</code></pre>
|
||||||
|
<p>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 <a href="https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html">bash documentation</a>.</p>
|
||||||
|
<p>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 <code>.png</code> image type, however you
|
||||||
|
can use the <code>imagemagick</code> program that we downloaded to convert other image types to <code>.png</code>, but that will be left up to you to figure out.</p>
|
||||||
|
<h2>Using Our Program</h2>
|
||||||
|
<p>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
|
||||||
|
<code>Save As</code>. This should save the image in your downloads folder, and you can keep the name of <code>part4-banner.png</code>.</p>
|
||||||
|
<p><strong>Make the program executable:</strong></p>
|
||||||
|
<pre><code class="language-bash">chmod u+x mktrans
|
||||||
|
</code></pre>
|
||||||
|
<p><strong>Make the image background transparent:</strong></p>
|
||||||
|
<pre><code class="language-bash">./mktrans ~/Downloads/part4-banner.png
|
||||||
|
</code></pre>
|
||||||
|
<p><strong>Open the image:</strong></p>
|
||||||
|
<pre><code class="language-bash">open part4-banner-transparent.png
|
||||||
|
</code></pre>
|
||||||
|
<p>It should look like below.</p>
|
||||||
|
<p><img src="/articles/images/2023-09-26-part4-banner-transparent.png" alt="banner-transparent" /></p>
|
||||||
|
<blockquote>
|
||||||
|
<p><strong>Note:</strong> If you are viewing this site in <em>light</em> 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.</p>
|
||||||
|
</blockquote>
|
||||||
|
<hr />
|
||||||
|
<blockquote>
|
||||||
|
<p><strong>Tip:</strong> Remove the image from the <code>~/.local/bin</code> by using <code>rm part4-banner-transparent.png</code>. Be aware that the <code>rm</code> command can not be
|
||||||
|
undone, so use with caution / knowledge. It is safer, until you are more comfortable to use the <code>Finder</code> application and move the file to
|
||||||
|
the trash. In <code>Finder</code>, you can show hidden directories by typing <code>⌘.</code> or go directly to the folder by typing <code>⇧⌘G</code> (shift + command + G)
|
||||||
|
and in the pop-up typing <code>~/.local/bin</code>.</p>
|
||||||
|
</blockquote>
|
||||||
|
<hr />
|
||||||
|
<p>That is it for this article. In the upcoming articles we will setup our <code>shell</code> environment so that we can use the commands we’ve built
|
||||||
|
without having to navigate to the <code>~/.local/bin</code> directory. Thank you for reading to the end, I hope you’re finding this series helpful.</p>
|
||||||
|
</article>
|
||||||
|
<div class="border-t border-light mt-8 pt-8">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
Written by
|
||||||
|
</h2>
|
||||||
|
<div class="flex flex-col lg:flex-row gap-8">
|
||||||
|
<div class="flex-[0_0_120px]">
|
||||||
|
<img class="w-[120px] h-[120px] rounded-full" src="/static/images/avatar.png"/>
|
||||||
|
</div>
|
||||||
|
<div class="prose">
|
||||||
|
<h3 class="!m-0">
|
||||||
|
Michael Housh
|
||||||
|
</h3>
|
||||||
|
<p class="text-gray">
|
||||||
|
HVAC business owner with over 27 years of experience. Writes articles about HVAC,
|
||||||
|
Programming, Home-Performance, and Building Science
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-16">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
More articles
|
||||||
|
</h2>
|
||||||
|
<div class="grid lg:grid-cols-2 gap-10">
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2025/vapor-htmx-todo-app/">Vapor + HTMX</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">January 05, 2025</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/programming/">programming</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
|
Build an example application using Vapor and HTMX.
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2024/free-as-in-freedom/">Free As In Freedom</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">April 09, 2024</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/open-source/">open-source</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
|
Salute to open-source software engineers
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
<p class="prose mt-8">
|
||||||
|
<a href="/articles/">› See all articles</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="site-footer container text-gray gray-links border-t border-light text-center pt-6 mt-8 text-sm">
|
||||||
|
<p>
|
||||||
|
Copyright © Michael Housh 2023-2025.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Built in Swift using
|
||||||
|
<a href="https://github.com/loopwerk/Saga" rel="nofollow" target="_blank">Saga</a>
|
||||||
|
(<a href="https://github.com/m-housh/mhoush.com" rel="nofollow" target="_blank">source</a>).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a href="http://localhost:3000/articles/feed.xml" rel="nofollow" target="_blank">RSS</a>
|
||||||
|
|
|
||||||
|
<a href="https://github.com/m-housh" rel="nofollow" target="_blank">Github</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.youtube.com/channel/UCb58SeURd5bObfTiL0KoliA" rel="nofollow" target="_blank">Youtube</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.facebook.com/michael.housh" rel="nofollow" target="_blank">Facebook</a>
|
||||||
|
|
|
||||||
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -70,26 +70,26 @@ This..." name="og:description"/>
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2023-12-14-most-important-job.gif"/>
|
<img alt="banner" src="http://localhost:3000/articles/images/2023-12-14-most-important-job.gif"/>
|
||||||
<p>This short tech tip is about something one of my good friends in the trade told me a long time ago,<br />
|
<p>This short tech tip is about something one of my good friends in the trade told me a long time ago,
|
||||||
that has stuck with me through the years. It is a simple phrase / mindset.</p>
|
that has stuck with me through the years. It is a simple phrase / mindset.</p>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>“The current job you’re on, is the most important job of your day”.</p>
|
<p>“The current job you’re on, is the most important job of your day”.</p>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<p>This mindset should be carried from the dispatcher, manager, and technician to make this successful.<br />
|
<p>This mindset should be carried from the dispatcher, manager, and technician to make this successful.
|
||||||
I’m not gonna lie and say this is always easy, or even always possible, but if you strive to use<br />
|
I’m not gonna lie and say this is always easy, or even always possible, but if you strive to use
|
||||||
this mindset then you will gain lifelong customers and satisfaction of not having loose ends hanging<br />
|
this mindset then you will gain lifelong customers and satisfaction of not having loose ends hanging
|
||||||
out there.</p>
|
out there.</p>
|
||||||
<p>I do think it’s also important to acknowledge that there are times that a technician has exhausted<br />
|
<p>I do think it’s also important to acknowledge that there are times that a technician has exhausted
|
||||||
all their options, maybe they just don’t have the mental capacity anymore to continue with a problem<br />
|
all their options, maybe they just don’t have the mental capacity anymore to continue with a problem
|
||||||
job, or need a break to come back another day with a fresh set of eyes, etc… This is also an<br />
|
job, or need a break to come back another day with a fresh set of eyes, etc… This is also an
|
||||||
important thing for a technician to realize, and hopefully those type of instances are much more few<br />
|
important thing for a technician to realize, and hopefully those type of instances are much more few
|
||||||
and far between, but I do want to acknowledge that scenario does also exist.</p>
|
and far between, but I do want to acknowledge that scenario does also exist.</p>
|
||||||
<p>If you are a business owner, then this is something to consider instilling in your operations.<br />
|
<p>If you are a business owner, then this is something to consider instilling in your operations.
|
||||||
Empower your technicians and dispatchers to understand when things need to be shuffled around in<br />
|
Empower your technicians and dispatchers to understand when things need to be shuffled around in
|
||||||
order to accommodate taking care of the customer at hand. It costs a lot of money to get a<br />
|
order to accommodate taking care of the customer at hand. It costs a lot of money to get a
|
||||||
technician to job, so minimizing truck rolls to the same job is important from a business<br />
|
technician to job, so minimizing truck rolls to the same job is important from a business
|
||||||
standpoint.</p>
|
standpoint.</p>
|
||||||
<p>This was just a quick tech tip of something that has been rolling around in my mind lately. I hope<br />
|
<p>This was just a quick tech tip of something that has been rolling around in my mind lately. I hope
|
||||||
you find it helpful and it sticks with you through your career as it has mine.</p>
|
you find it helpful and it sticks with you through your career as it has mine.</p>
|
||||||
</article>
|
</article>
|
||||||
<div class="border-t border-light mt-8 pt-8">
|
<div class="border-t border-light mt-8 pt-8">
|
||||||
@@ -125,7 +125,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2025-01-05-vapor-htmx-todo-app.png"/>
|
|
||||||
Build an example application using Vapor and HTMX.
|
Build an example application using Vapor and HTMX.
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -139,7 +138,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2024/free-as-in-freedom/"><div>
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2024-04-09-free-as-in-freedom.png"/>
|
|
||||||
Salute to open-source software engineers
|
Salute to open-source software engineers
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -170,6 +168,12 @@ Programming, Home-Performance, and Building Science
|
|||||||
|
|
|
|
||||||
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
</p>
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
221
deploy/articles/2023/pounds-of-water-removed/index.html
Normal file
221
deploy/articles/2023/pounds-of-water-removed/index.html
Normal file
@@ -0,0 +1,221 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<meta content="#0e1112" media="(prefers-color-scheme: dark)" name="theme-color"/>
|
||||||
|
<meta content="#566B78" media="(prefers-color-scheme: light)" name="theme-color"/>
|
||||||
|
<meta content="Michael Housh" name="author"/>
|
||||||
|
<meta content="Mhoush" name="apple-mobile-web-app-title"/>
|
||||||
|
<meta content="initial-scale=1.0, width=device-width" name="viewport"/>
|
||||||
|
<meta content="telephone=no" name="format-detection"/>
|
||||||
|
<meta content="True" name="HandheldFriendly"/>
|
||||||
|
<meta content="320" name="MobileOptimized"/>
|
||||||
|
<meta content="Mhoush" name="og:site_name"/>
|
||||||
|
<meta content="hvac, developer, swift, home-performance, design" name="keywords"/>
|
||||||
|
<title>
|
||||||
|
mhoush: Pounds of Water Removed
|
||||||
|
</title>
|
||||||
|
<link href="/static/favicon.ico" rel="shortcut icon"/>
|
||||||
|
<link href="/static/output.css" rel="stylesheet"/>
|
||||||
|
<link href="/static/style.css" rel="stylesheet"/>
|
||||||
|
<link href="/articles/feed.xml" rel="alternate" title="mhoush" type="application/rss+xml"/>
|
||||||
|
<link href="/static/prism.css" rel="stylesheet"/>
|
||||||
|
<meta content="This is an article that shows how to calculate the pounds of water removed from an air stream, given the entering conditions (return air
|
||||||
|
stream) and the outlet conditions (supply air stream).
|
||||||
|
This is useful in the field when you want to calculate the..." name="description"/>
|
||||||
|
<meta content="summary_large_image" name="twitter:card"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-09-08-pounds-of-water-removed.png" name="twitter:image"/>
|
||||||
|
<meta content="Pounds of Water Removed" name="twitter:image:alt"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images//articles/2023/pounds-of-water-removed/" name="og:url"/>
|
||||||
|
<meta content="Pounds of Water Removed" name="og:title"/>
|
||||||
|
<meta content="This is an article that shows how to calculate the pounds of water removed from an air stream, given the entering conditions (return air
|
||||||
|
stream) and the outlet conditions (supply air stream).
|
||||||
|
This is useful in the field when you want to calculate the..." name="og:description"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-09-08-pounds-of-water-removed.png" name="og:image"/>
|
||||||
|
<meta content="1014" name="og:image:width"/>
|
||||||
|
<meta content="530" name="og:image:height"/>
|
||||||
|
<script crossorigin="anonymous" src="https://kit.fontawesome.com/f209982030.js">
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body class="bg-page text-white pb-5 font-avenir articles">
|
||||||
|
<header class="bg-nav text-gray py-4 text-base/6 lg:fixed w-full lg:h-[62px]">
|
||||||
|
<nav class="container flex gap-x-5 lg:gap-x-y items-center">
|
||||||
|
<ul class="flex flex-wrap gap-x-2 lg:gap-x-5">
|
||||||
|
<li>
|
||||||
|
<a class href="/">Home</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="active" href="/articles/">Articles</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class href="/about/">About</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<div class="container pt-12 lg:pt-28">
|
||||||
|
<article class="prose">
|
||||||
|
<h1>
|
||||||
|
Pounds of Water Removed
|
||||||
|
</h1>
|
||||||
|
<div class="-mt-6">
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">September 08, 2023</span>381 words, posted in <a href="/articles/tag/hvac/">HVAC</a>, <a href="/articles/tag/formulas/">formulas</a>, <a href="/articles/tag/psychrometric-chart/">psychrometric-chart</a>, <a href="/articles/tag/psychrometrics/">psychrometrics</a> and <a href="/articles/tag/tech-tip/">tech-tip</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<img alt="banner" src="http://localhost:3000/articles/images/2023-09-08-pounds-of-water-removed.png"/>
|
||||||
|
<p>This is an article that shows how to calculate the pounds of water removed from an air stream, given the entering conditions (return air
|
||||||
|
stream) and the outlet conditions (supply air stream).</p>
|
||||||
|
<p>This is useful in the field when you want to calculate the amount of moisture removed from an air-conditioner or a dehumidifier. This
|
||||||
|
article assumes that you have knowledge of a psychrometric chart. If you do not have basic knowledge of the psychrometric chart, then here
|
||||||
|
are a couple articles to familiarize yourself.</p>
|
||||||
|
<h2>Articles</h2>
|
||||||
|
<ul>
|
||||||
|
<li><a href="https://hvacrschool.com/understand-dew-point-absolute-moisture-right-side-psych-chart/">Understand Dew-Point</a></li>
|
||||||
|
<li><a href="https://hvacrschool.com/the-impact-of-adding-or-removing-water-from-air/">Impact of Adding or Removing Water from Air</a></li>
|
||||||
|
</ul>
|
||||||
|
<h2>Scenario</h2>
|
||||||
|
<p>Let’s imagine that we have an air-conditioner that has the following measurements taken:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Return Air: 75° / 50% RH</li>
|
||||||
|
<li>Supply Air: 55° / 81% RH</li>
|
||||||
|
</ul>
|
||||||
|
<p>We plot the two values on the psychrometric chart (black line represents the return air conditions and blue line represents the supply air
|
||||||
|
conditions).</p>
|
||||||
|
<p><img src="/articles/images/2023-09-08-pounds-of-water-removed.png" alt="chart" /></p>
|
||||||
|
<p>We start by finding the corresponding dry-bulb temperature at the bottom of the chart and draw a straight line up to where it intersects the
|
||||||
|
relative humidity curve. After that we draw a straight line to the right side of the psychrometric chart to find the grains of moisture per
|
||||||
|
pound of air.</p>
|
||||||
|
<p>This gives us the following values:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Return Air: 66 gr/lb</li>
|
||||||
|
<li>Supply Air: 52 gr/lb</li>
|
||||||
|
</ul>
|
||||||
|
<p>We can then use the following formula to calculate the pounds of water removed.</p>
|
||||||
|
<p><img src="/articles/images/2023-09-08-formula.png" alt="formula" /></p>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th><strong>Where</strong></th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td><strong>W</strong></td>
|
||||||
|
<td><em>Weight of water in pounds per hour</em></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><strong>4.5</strong></td>
|
||||||
|
<td><em>Constant based on density / specific heat of moist air</em></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><strong>CFM</strong></td>
|
||||||
|
<td><em>Airflow in cubic feet per minute</em></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><strong>∆G</strong></td>
|
||||||
|
<td><em>Difference in grains of moisture</em></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><strong>7000</strong></td>
|
||||||
|
<td><em>Constant based on grains of moisture in saturated air</em></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<h2>Solution</h2>
|
||||||
|
<p>First, we solve for the difference in grains between the two air streams.</p>
|
||||||
|
<p>∆G = 66 - 52 = 14</p>
|
||||||
|
<p>Next, we’ve measured our airflow and have determined to have <strong>797 CFM</strong> of airflow across the evaporator coil, so we can substitute our
|
||||||
|
values into the formula.</p>
|
||||||
|
<p><img src="/articles/images/2023-09-08-solution.png" alt="solution" /></p>
|
||||||
|
<p>So, we are removing about 7 pounds of water per hour at these conditions.</p>
|
||||||
|
<p>Another thing to note is that 1 pound of water is approximately 1 pint of water, which can be useful when working with dehumidifiers that
|
||||||
|
can often be rated in pints per day.</p>
|
||||||
|
<p>I hope you’ve found this article helpful, thanks for reading!</p>
|
||||||
|
</article>
|
||||||
|
<div class="border-t border-light mt-8 pt-8">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
Written by
|
||||||
|
</h2>
|
||||||
|
<div class="flex flex-col lg:flex-row gap-8">
|
||||||
|
<div class="flex-[0_0_120px]">
|
||||||
|
<img class="w-[120px] h-[120px] rounded-full" src="/static/images/avatar.png"/>
|
||||||
|
</div>
|
||||||
|
<div class="prose">
|
||||||
|
<h3 class="!m-0">
|
||||||
|
Michael Housh
|
||||||
|
</h3>
|
||||||
|
<p class="text-gray">
|
||||||
|
HVAC business owner with over 27 years of experience. Writes articles about HVAC,
|
||||||
|
Programming, Home-Performance, and Building Science
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-16">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
More articles
|
||||||
|
</h2>
|
||||||
|
<div class="grid lg:grid-cols-2 gap-10">
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2025/vapor-htmx-todo-app/">Vapor + HTMX</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">January 05, 2025</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/programming/">programming</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
|
Build an example application using Vapor and HTMX.
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2024/free-as-in-freedom/">Free As In Freedom</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">April 09, 2024</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/open-source/">open-source</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
|
Salute to open-source software engineers
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
<p class="prose mt-8">
|
||||||
|
<a href="/articles/">› See all articles</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="site-footer container text-gray gray-links border-t border-light text-center pt-6 mt-8 text-sm">
|
||||||
|
<p>
|
||||||
|
Copyright © Michael Housh 2023-2025.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Built in Swift using
|
||||||
|
<a href="https://github.com/loopwerk/Saga" rel="nofollow" target="_blank">Saga</a>
|
||||||
|
(<a href="https://github.com/m-housh/mhoush.com" rel="nofollow" target="_blank">source</a>).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a href="http://localhost:3000/articles/feed.xml" rel="nofollow" target="_blank">RSS</a>
|
||||||
|
|
|
||||||
|
<a href="https://github.com/m-housh" rel="nofollow" target="_blank">Github</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.youtube.com/channel/UCb58SeURd5bObfTiL0KoliA" rel="nofollow" target="_blank">Youtube</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.facebook.com/michael.housh" rel="nofollow" target="_blank">Facebook</a>
|
||||||
|
|
|
||||||
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
175
deploy/articles/2023/rss-feed/index.html
Normal file
175
deploy/articles/2023/rss-feed/index.html
Normal file
@@ -0,0 +1,175 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<meta content="#0e1112" media="(prefers-color-scheme: dark)" name="theme-color"/>
|
||||||
|
<meta content="#566B78" media="(prefers-color-scheme: light)" name="theme-color"/>
|
||||||
|
<meta content="Michael Housh" name="author"/>
|
||||||
|
<meta content="Mhoush" name="apple-mobile-web-app-title"/>
|
||||||
|
<meta content="initial-scale=1.0, width=device-width" name="viewport"/>
|
||||||
|
<meta content="telephone=no" name="format-detection"/>
|
||||||
|
<meta content="True" name="HandheldFriendly"/>
|
||||||
|
<meta content="320" name="MobileOptimized"/>
|
||||||
|
<meta content="Mhoush" name="og:site_name"/>
|
||||||
|
<meta content="hvac, developer, swift, home-performance, design" name="keywords"/>
|
||||||
|
<title>
|
||||||
|
mhoush: Rss Feed
|
||||||
|
</title>
|
||||||
|
<link href="/static/favicon.ico" rel="shortcut icon"/>
|
||||||
|
<link href="/static/output.css" rel="stylesheet"/>
|
||||||
|
<link href="/static/style.css" rel="stylesheet"/>
|
||||||
|
<link href="/articles/feed.xml" rel="alternate" title="mhoush" type="application/rss+xml"/>
|
||||||
|
<link href="/static/prism.css" rel="stylesheet"/>
|
||||||
|
<meta content="In this article I will show how to add this site’s rss feed. In particular, we will be using NetNewsWire as the
|
||||||
|
rss reader.
|
||||||
|
What is an RSS Feed
|
||||||
|
An RSS feed will show you new posts, generally from a blog, without having to remember to check the..." name="description"/>
|
||||||
|
<meta content="summary_large_image" name="twitter:card"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-08-10-rss-feed.gif" name="twitter:image"/>
|
||||||
|
<meta content="Rss Feed" name="twitter:image:alt"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images//articles/2023/rss-feed/" name="og:url"/>
|
||||||
|
<meta content="Rss Feed" name="og:title"/>
|
||||||
|
<meta content="In this article I will show how to add this site’s rss feed. In particular, we will be using NetNewsWire as the
|
||||||
|
rss reader.
|
||||||
|
What is an RSS Feed
|
||||||
|
An RSS feed will show you new posts, generally from a blog, without having to remember to check the..." name="og:description"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-08-10-rss-feed.gif" name="og:image"/>
|
||||||
|
<meta content="1014" name="og:image:width"/>
|
||||||
|
<meta content="530" name="og:image:height"/>
|
||||||
|
<script crossorigin="anonymous" src="https://kit.fontawesome.com/f209982030.js">
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body class="bg-page text-white pb-5 font-avenir articles">
|
||||||
|
<header class="bg-nav text-gray py-4 text-base/6 lg:fixed w-full lg:h-[62px]">
|
||||||
|
<nav class="container flex gap-x-5 lg:gap-x-y items-center">
|
||||||
|
<ul class="flex flex-wrap gap-x-2 lg:gap-x-5">
|
||||||
|
<li>
|
||||||
|
<a class href="/">Home</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="active" href="/articles/">Articles</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class href="/about/">About</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<div class="container pt-12 lg:pt-28">
|
||||||
|
<article class="prose">
|
||||||
|
<h1>
|
||||||
|
Rss Feed
|
||||||
|
</h1>
|
||||||
|
<div class="-mt-6">
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">August 10, 2023</span>166 words, posted in <a href="/articles/tag/how-to/">how-to</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<img alt="banner" src="http://localhost:3000/articles/images/2023-08-10-rss-feed.gif"/>
|
||||||
|
<p>In this article I will show how to add this site’s rss feed. In particular, we will be using <a href="https://netnewswire.com">NetNewsWire</a> as the
|
||||||
|
rss reader.</p>
|
||||||
|
<h2>What is an RSS Feed</h2>
|
||||||
|
<p>An RSS feed will show you new posts, generally from a blog, without having to remember to check the website at regular intervals or signup
|
||||||
|
for an email list for notifications.</p>
|
||||||
|
<p>NetNewsWire puts an RSS feed as:</p>
|
||||||
|
<p><strong>It’s like podcasts</strong> - but for <em>reading.</em></p>
|
||||||
|
<p>You consume an RSS feed, using an RSS reader application or extension in your browser.</p>
|
||||||
|
<h2>Step One</h2>
|
||||||
|
<p>First find and download an RSS reader, you can download <a href="https://netnewswire.com">NetNewsWire</a> for macOS from the link, or for iOS from the
|
||||||
|
<a href="https://apps.apple.com/us/app/netnewswire-rss-reader/id1480640210">AppStore</a>.</p>
|
||||||
|
<h2>Step Two</h2>
|
||||||
|
<p>Add the rss feed to stay up to date when I publish new articles.</p>
|
||||||
|
<ol>
|
||||||
|
<li>Click the plus in the right side of the sidebar and select <code>New Feed...</code></li>
|
||||||
|
<li>In the URL field add: <code>https://mhoush.com/articles/feed.xml</code></li>
|
||||||
|
<li>Optionally give it a name</li>
|
||||||
|
<li>Click the <code>Add</code> button.</li>
|
||||||
|
</ol>
|
||||||
|
<p><img src="/articles/images/2023-08-10-rss-feed.gif" alt="rss gif" /></p>
|
||||||
|
<p>That’s it.</p>
|
||||||
|
</article>
|
||||||
|
<div class="border-t border-light mt-8 pt-8">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
Written by
|
||||||
|
</h2>
|
||||||
|
<div class="flex flex-col lg:flex-row gap-8">
|
||||||
|
<div class="flex-[0_0_120px]">
|
||||||
|
<img class="w-[120px] h-[120px] rounded-full" src="/static/images/avatar.png"/>
|
||||||
|
</div>
|
||||||
|
<div class="prose">
|
||||||
|
<h3 class="!m-0">
|
||||||
|
Michael Housh
|
||||||
|
</h3>
|
||||||
|
<p class="text-gray">
|
||||||
|
HVAC business owner with over 27 years of experience. Writes articles about HVAC,
|
||||||
|
Programming, Home-Performance, and Building Science
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-16">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
More articles
|
||||||
|
</h2>
|
||||||
|
<div class="grid lg:grid-cols-2 gap-10">
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2025/vapor-htmx-todo-app/">Vapor + HTMX</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">January 05, 2025</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/programming/">programming</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
|
Build an example application using Vapor and HTMX.
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2024/free-as-in-freedom/">Free As In Freedom</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">April 09, 2024</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/open-source/">open-source</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
|
Salute to open-source software engineers
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
<p class="prose mt-8">
|
||||||
|
<a href="/articles/">› See all articles</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="site-footer container text-gray gray-links border-t border-light text-center pt-6 mt-8 text-sm">
|
||||||
|
<p>
|
||||||
|
Copyright © Michael Housh 2023-2025.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Built in Swift using
|
||||||
|
<a href="https://github.com/loopwerk/Saga" rel="nofollow" target="_blank">Saga</a>
|
||||||
|
(<a href="https://github.com/m-housh/mhoush.com" rel="nofollow" target="_blank">source</a>).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a href="http://localhost:3000/articles/feed.xml" rel="nofollow" target="_blank">RSS</a>
|
||||||
|
|
|
||||||
|
<a href="https://github.com/m-housh" rel="nofollow" target="_blank">Github</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.youtube.com/channel/UCb58SeURd5bObfTiL0KoliA" rel="nofollow" target="_blank">Youtube</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.facebook.com/michael.housh" rel="nofollow" target="_blank">Facebook</a>
|
||||||
|
|
|
||||||
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,209 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<meta content="#0e1112" media="(prefers-color-scheme: dark)" name="theme-color"/>
|
||||||
|
<meta content="#566B78" media="(prefers-color-scheme: light)" name="theme-color"/>
|
||||||
|
<meta content="Michael Housh" name="author"/>
|
||||||
|
<meta content="Mhoush" name="apple-mobile-web-app-title"/>
|
||||||
|
<meta content="initial-scale=1.0, width=device-width" name="viewport"/>
|
||||||
|
<meta content="telephone=no" name="format-detection"/>
|
||||||
|
<meta content="True" name="HandheldFriendly"/>
|
||||||
|
<meta content="320" name="MobileOptimized"/>
|
||||||
|
<meta content="Mhoush" name="og:site_name"/>
|
||||||
|
<meta content="hvac, developer, swift, home-performance, design" name="keywords"/>
|
||||||
|
<title>
|
||||||
|
mhoush: Dehumidifier Sizing by Latent Load
|
||||||
|
</title>
|
||||||
|
<link href="/static/favicon.ico" rel="shortcut icon"/>
|
||||||
|
<link href="/static/output.css" rel="stylesheet"/>
|
||||||
|
<link href="/static/style.css" rel="stylesheet"/>
|
||||||
|
<link href="/articles/feed.xml" rel="alternate" title="mhoush" type="application/rss+xml"/>
|
||||||
|
<link href="/static/prism.css" rel="stylesheet"/>
|
||||||
|
<meta content="This is a quick article to show how to calculate the size of dehumidifier needed based on the latent load of a building. This is useful if
|
||||||
|
you’ve done a load calculation and know the latent load of the structure.
|
||||||
|
Formulas
|
||||||
|
The formula above is used to..." name="description"/>
|
||||||
|
<meta content="summary_large_image" name="twitter:card"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-09-15-sizing-dehumidifier-by-latent-load.png" name="twitter:image"/>
|
||||||
|
<meta content="Dehumidifier Sizing by Latent Load" name="twitter:image:alt"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images//articles/2023/sizing-dehumidifier-by-latent-load/" name="og:url"/>
|
||||||
|
<meta content="Dehumidifier Sizing by Latent Load" name="og:title"/>
|
||||||
|
<meta content="This is a quick article to show how to calculate the size of dehumidifier needed based on the latent load of a building. This is useful if
|
||||||
|
you’ve done a load calculation and know the latent load of the structure.
|
||||||
|
Formulas
|
||||||
|
The formula above is used to..." name="og:description"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-09-15-sizing-dehumidifier-by-latent-load.png" name="og:image"/>
|
||||||
|
<meta content="1014" name="og:image:width"/>
|
||||||
|
<meta content="530" name="og:image:height"/>
|
||||||
|
<script crossorigin="anonymous" src="https://kit.fontawesome.com/f209982030.js">
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body class="bg-page text-white pb-5 font-avenir articles">
|
||||||
|
<header class="bg-nav text-gray py-4 text-base/6 lg:fixed w-full lg:h-[62px]">
|
||||||
|
<nav class="container flex gap-x-5 lg:gap-x-y items-center">
|
||||||
|
<ul class="flex flex-wrap gap-x-2 lg:gap-x-5">
|
||||||
|
<li>
|
||||||
|
<a class href="/">Home</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="active" href="/articles/">Articles</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class href="/about/">About</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<div class="container pt-12 lg:pt-28">
|
||||||
|
<article class="prose">
|
||||||
|
<h1>
|
||||||
|
Dehumidifier Sizing by Latent Load
|
||||||
|
</h1>
|
||||||
|
<div class="-mt-6">
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">September 15, 2023</span>267 words, posted in <a href="/articles/tag/hvac/">HVAC</a>, <a href="/articles/tag/design/">design</a>, <a href="/articles/tag/formulas/">formulas</a> and <a href="/articles/tag/tech-tip/">tech-tip</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<img alt="banner" src="http://localhost:3000/articles/images/2023-09-15-sizing-dehumidifier-by-latent-load.png"/>
|
||||||
|
<p>This is a quick article to show how to calculate the size of dehumidifier needed based on the latent load of a building. This is useful if
|
||||||
|
you’ve done a load calculation and know the latent load of the structure.</p>
|
||||||
|
<h2>Formulas</h2>
|
||||||
|
<p>The formula above is used to solve for the pints per hour required to size a dehumidifier.</p>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Where</th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>Ql</td>
|
||||||
|
<td>Latent load</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Ph</td>
|
||||||
|
<td>Pints / hour</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<p>We can then convert to pints per day by multiplying the answer by 24 hours, below is the combined formula.</p>
|
||||||
|
<p><img src="/articles/images/2023-09-15-pints-per-day.png" alt="pints-per-day-formula" /></p>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Where</th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>Ql</td>
|
||||||
|
<td>Latent load</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Pd</td>
|
||||||
|
<td>Pints / day</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<p>In some cases you may want to size the dehumidifier for less than the full latent load, assuming that the air-conditioner (when sized
|
||||||
|
properly) is going to cover the full latent load when at peak design temperatures and that the peak latent period for your area is during
|
||||||
|
peak cooling demand.</p>
|
||||||
|
<h2>Example</h2>
|
||||||
|
<p>Let’s imagine we have done a load calculation and have a latent load of 4,334 BTU/h. So, plugging that into our above formula.</p>
|
||||||
|
<p><img src="/articles/images/2023-09-15-pints-per-day-example.png" alt="pints-per-day-formula-example" /></p>
|
||||||
|
<p>Or if we just want to cover the latent capacity at 85% of the full latent load.</p>
|
||||||
|
<p><img src="/articles/images/2023-09-15-pints-per-day-example2.png" alt="pints-per-day-formula-example" /></p>
|
||||||
|
<p>This gives us some guidance that we would need to select a dehumidifier that is rated for 84-99 pints per day, depending on which condition
|
||||||
|
we wanted to use.</p>
|
||||||
|
<p>I don’t feel oversizing a dehumidifier, within reason, is that problematic (or at least it does not come with the same problems as an
|
||||||
|
oversized air conditioner), so I would personally go for a 100-120 pint per day model dehumidifier in this application.</p>
|
||||||
|
<p>Thanks for reading!</p>
|
||||||
|
</article>
|
||||||
|
<div class="border-t border-light mt-8 pt-8">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
Written by
|
||||||
|
</h2>
|
||||||
|
<div class="flex flex-col lg:flex-row gap-8">
|
||||||
|
<div class="flex-[0_0_120px]">
|
||||||
|
<img class="w-[120px] h-[120px] rounded-full" src="/static/images/avatar.png"/>
|
||||||
|
</div>
|
||||||
|
<div class="prose">
|
||||||
|
<h3 class="!m-0">
|
||||||
|
Michael Housh
|
||||||
|
</h3>
|
||||||
|
<p class="text-gray">
|
||||||
|
HVAC business owner with over 27 years of experience. Writes articles about HVAC,
|
||||||
|
Programming, Home-Performance, and Building Science
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-16">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
More articles
|
||||||
|
</h2>
|
||||||
|
<div class="grid lg:grid-cols-2 gap-10">
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2025/vapor-htmx-todo-app/">Vapor + HTMX</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">January 05, 2025</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/programming/">programming</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
|
Build an example application using Vapor and HTMX.
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2024/free-as-in-freedom/">Free As In Freedom</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">April 09, 2024</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/open-source/">open-source</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
|
Salute to open-source software engineers
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
<p class="prose mt-8">
|
||||||
|
<a href="/articles/">› See all articles</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="site-footer container text-gray gray-links border-t border-light text-center pt-6 mt-8 text-sm">
|
||||||
|
<p>
|
||||||
|
Copyright © Michael Housh 2023-2025.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Built in Swift using
|
||||||
|
<a href="https://github.com/loopwerk/Saga" rel="nofollow" target="_blank">Saga</a>
|
||||||
|
(<a href="https://github.com/m-housh/mhoush.com" rel="nofollow" target="_blank">source</a>).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a href="http://localhost:3000/articles/feed.xml" rel="nofollow" target="_blank">RSS</a>
|
||||||
|
|
|
||||||
|
<a href="https://github.com/m-housh" rel="nofollow" target="_blank">Github</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.youtube.com/channel/UCb58SeURd5bObfTiL0KoliA" rel="nofollow" target="_blank">Youtube</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.facebook.com/michael.housh" rel="nofollow" target="_blank">Facebook</a>
|
||||||
|
|
|
||||||
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -66,71 +66,71 @@ It has been one of those “when it rains, it pours” type of weeks. As..." nam
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2023-10-18-the-struggle.png"/>
|
<img alt="banner" src="http://localhost:3000/articles/images/2023-10-18-the-struggle.png"/>
|
||||||
<p>This is a get stuff of my chest article. Probably going to be a mixture of ranting and whining. If<br />
|
<p>This is a get stuff of my chest article. Probably going to be a mixture of ranting and whining. If
|
||||||
that is not your cup of tea then feel free to skip this article.</p>
|
that is not your cup of tea then feel free to skip this article.</p>
|
||||||
<h2>The struggle</h2>
|
<h2>The struggle</h2>
|
||||||
<p>It has been one of those “when it rains, it pours” type of weeks. As write this, I feel like a baby<br />
|
<p>It has been one of those “when it rains, it pours” type of weeks. As write this, I feel like a baby
|
||||||
/ complainer, which is not my intention, but here it goes.</p>
|
/ complainer, which is not my intention, but here it goes.</p>
|
||||||
<p>My aunt had a stroke and is likely not going to make it through the week. My aunt has always lived<br />
|
<p>My aunt had a stroke and is likely not going to make it through the week. My aunt has always lived
|
||||||
in Florida during my life / memory, but has always come to visit. She is my mom’s oldest sister (9<br />
|
in Florida during my life / memory, but has always come to visit. She is my mom’s oldest sister (9
|
||||||
years apart), so she helped raise my mother growing up. They’ve always had a close relationship and<br />
|
years apart), so she helped raise my mother growing up. They’ve always had a close relationship and
|
||||||
are like two peas in a pod. They would always visit us, especially while my grand-parents were still<br />
|
are like two peas in a pod. They would always visit us, especially while my grand-parents were still
|
||||||
alive. She is currently not really awake or expected to make it. She does not eat / drink and<br />
|
alive. She is currently not really awake or expected to make it. She does not eat / drink and
|
||||||
they’ve basically just been making her comfortable.</p>
|
they’ve basically just been making her comfortable.</p>
|
||||||
<p>One of my employees broke his neck over the weekend. I don’t have a ton of details on this subject,<br />
|
<p>One of my employees broke his neck over the weekend. I don’t have a ton of details on this subject,
|
||||||
but he had surgery to fuse some discs back together and should eventually be ok, however it will be<br />
|
but he had surgery to fuse some discs back together and should eventually be ok, however it will be
|
||||||
a long recovery time.</p>
|
a long recovery time.</p>
|
||||||
<p>A few weeks ago, I commited one of the deadly sins of running a blower door test without checking /<br />
|
<p>A few weeks ago, I commited one of the deadly sins of running a blower door test without checking /
|
||||||
asking about the fireplaces, which caused lord knows how much damage from the soot that was spread<br />
|
asking about the fireplaces, which caused lord knows how much damage from the soot that was spread
|
||||||
throughout the living room(s).</p>
|
throughout the living room(s).</p>
|
||||||
<p>An online friend lost her mother.</p>
|
<p>An online friend lost her mother.</p>
|
||||||
<p>All of these things have just got me emotional.</p>
|
<p>All of these things have just got me emotional.</p>
|
||||||
<h2>My secrets</h2>
|
<h2>My secrets</h2>
|
||||||
<p>I am an emotional person, sometimes to my detriment. I’m prone to fits of anger and depression. I<br />
|
<p>I am an emotional person, sometimes to my detriment. I’m prone to fits of anger and depression. I
|
||||||
spent many years masking things through alcohol abuse and many other idiotic tendencies. I still<br />
|
spent many years masking things through alcohol abuse and many other idiotic tendencies. I still
|
||||||
drink on occasion, but not as I once did.</p>
|
drink on occasion, but not as I once did.</p>
|
||||||
<p>I often put my faith in folks, even if I haven’t met them in person, this can often lead to being<br />
|
<p>I often put my faith in folks, even if I haven’t met them in person, this can often lead to being
|
||||||
let down. I guess I struggle sometimes with the reality of online relationships. I think that people<br />
|
let down. I guess I struggle sometimes with the reality of online relationships. I think that people
|
||||||
are genuine, because I’m that way (how I act online is the same as I act in person for the most<br />
|
are genuine, because I’m that way (how I act online is the same as I act in person for the most
|
||||||
part). I will happily show / share the good and the bad, in hopes that someone may learn. This is<br />
|
part). I will happily show / share the good and the bad, in hopes that someone may learn. This is
|
||||||
not at all something to be ashamed of, or anything that I’d like to change, however it does on<br />
|
not at all something to be ashamed of, or anything that I’d like to change, however it does on
|
||||||
occasion lead me into turmoil when I find out some true identity / personality of someone.</p>
|
occasion lead me into turmoil when I find out some true identity / personality of someone.</p>
|
||||||
<p>I hold grudges, like forever grudges. It is very hard for me to get over somethings, even if I want<br />
|
<p>I hold grudges, like forever grudges. It is very hard for me to get over somethings, even if I want
|
||||||
to. I can sometimes put things out of my mind, but when I’m spinning, they will resurface. I want to<br />
|
to. I can sometimes put things out of my mind, but when I’m spinning, they will resurface. I want to
|
||||||
forgive people, but it is just not the way it works for me often times. It takes a lot to get me<br />
|
forgive people, but it is just not the way it works for me often times. It takes a lot to get me
|
||||||
beyond my breaking point, but once someone has gotten me there, there is likely no turning back for<br />
|
beyond my breaking point, but once someone has gotten me there, there is likely no turning back for
|
||||||
that person. Luckily, I can count on one hand the number of folks that I’ve had to cut out of my<br />
|
that person. Luckily, I can count on one hand the number of folks that I’ve had to cut out of my
|
||||||
life for these reasons. I’d love to say that I’m a bigger / better person, that I forgive them, but<br />
|
life for these reasons. I’d love to say that I’m a bigger / better person, that I forgive them, but
|
||||||
truthfully I do not.</p>
|
truthfully I do not.</p>
|
||||||
<p>My emotions sometimes make me say things publicly that I should keep to myself. I don’t have a lot<br />
|
<p>My emotions sometimes make me say things publicly that I should keep to myself. I don’t have a lot
|
||||||
of regret around these things, because I generally mean what I say, and also feel we are entitled to<br />
|
of regret around these things, because I generally mean what I say, and also feel we are entitled to
|
||||||
opinions as well as entitled to change those opinions as often as we see fit. Although I don’t<br />
|
opinions as well as entitled to change those opinions as often as we see fit. Although I don’t
|
||||||
regret them per-se, it does make me wonder what type of impression it leaves (something for future<br />
|
regret them per-se, it does make me wonder what type of impression it leaves (something for future
|
||||||
pondering, perhaps).</p>
|
pondering, perhaps).</p>
|
||||||
<p>I’m one of those that says “I don’t care what they think about me”, when I really do care what<br />
|
<p>I’m one of those that says “I don’t care what they think about me”, when I really do care what
|
||||||
people think about me. This often leads to fear and anxiety, especially in social settings. I’m not<br />
|
people think about me. This often leads to fear and anxiety, especially in social settings. I’m not
|
||||||
the greatest at conversation, I’m better at writing or some interaction that gives me a bit of time<br />
|
the greatest at conversation, I’m better at writing or some interaction that gives me a bit of time
|
||||||
to think before responding. Therefore, I’m quick to make a joke or something rather than having<br />
|
to think before responding. Therefore, I’m quick to make a joke or something rather than having
|
||||||
thoughtful / genuine responses.</p>
|
thoughtful / genuine responses.</p>
|
||||||
<h2>Community</h2>
|
<h2>Community</h2>
|
||||||
<p>All of these things have just got me thinking about community. Community is an aspect that seems<br />
|
<p>All of these things have just got me thinking about community. Community is an aspect that seems
|
||||||
distant nowadays, even though we have more opportunity than ever. We call ourselves part of<br />
|
distant nowadays, even though we have more opportunity than ever. We call ourselves part of
|
||||||
communities, especially online, but I’m not convinced that it is really community (or at least not<br />
|
communities, especially online, but I’m not convinced that it is really community (or at least not
|
||||||
most of the time, not saying it can’t be / in absolute terms).</p>
|
most of the time, not saying it can’t be / in absolute terms).</p>
|
||||||
<p>I have met a lot of folks online that I consider true friends. Friends that I would do anything for<br />
|
<p>I have met a lot of folks online that I consider true friends. Friends that I would do anything for
|
||||||
and feel they would do anything for me, just like my real life friends who have stuck with me for<br />
|
and feel they would do anything for me, just like my real life friends who have stuck with me for
|
||||||
many years. These are people that challenge me and how I think on a regular basis. They do their<br />
|
many years. These are people that challenge me and how I think on a regular basis. They do their
|
||||||
best to lift me up when I’m down.</p>
|
best to lift me up when I’m down.</p>
|
||||||
<p>It’s easy to hide when so much of our interactions are not really in person, to feel like the<br />
|
<p>It’s easy to hide when so much of our interactions are not really in person, to feel like the
|
||||||
relationships we do have are not genuine, but that’s awfully cynical. I prefer to give people the<br />
|
relationships we do have are not genuine, but that’s awfully cynical. I prefer to give people the
|
||||||
benefit / trust they deserve until, at least until they don’t then see my part about holding grudges<br />
|
benefit / trust they deserve until, at least until they don’t then see my part about holding grudges
|
||||||
;)</p>
|
;)</p>
|
||||||
<p>Do you ever feel the same? Instead of being cynical and down, today, I’m trying to be positive. I’m<br />
|
<p>Do you ever feel the same? Instead of being cynical and down, today, I’m trying to be positive. I’m
|
||||||
trying to share a little bit of what I feel community should be. Although, I’ve never met HVAChicks<br />
|
trying to share a little bit of what I feel community should be. Although, I’ve never met HVAChicks
|
||||||
Jennifer in real life, I read today about her mom and decided to take an hour or so to put together<br />
|
Jennifer in real life, I read today about her mom and decided to take an hour or so to put together
|
||||||
a website for the <a href="https://hvachicks.com">HVAChicks Community</a>, hoping it would bring a moment of<br />
|
a website for the <a href="https://hvachicks.com">HVAChicks Community</a>, hoping it would bring a moment of
|
||||||
happiness to her day. While I’ve deployed several websites in the past, this one for some reason was<br />
|
happiness to her day. While I’ve deployed several websites in the past, this one for some reason was
|
||||||
a total PITA, but I got through it. I could feel how grateful she was when I shared it with her (and<br />
|
a total PITA, but I got through it. I could feel how grateful she was when I shared it with her (and
|
||||||
it’s basic AF), but that truly made me feel useful / great after being down in the dumps for a bit.</p>
|
it’s basic AF), but that truly made me feel useful / great after being down in the dumps for a bit.</p>
|
||||||
<h2>Conclusion</h2>
|
<h2>Conclusion</h2>
|
||||||
<p>I’ve probably rambled enough and am losing direction here, so I will end with a few things.</p>
|
<p>I’ve probably rambled enough and am losing direction here, so I will end with a few things.</p>
|
||||||
@@ -140,43 +140,43 @@ it’s basic AF), but that truly made me feel useful / great after being down in
|
|||||||
<li>Spend time with your loved ones, while you can.</li>
|
<li>Spend time with your loved ones, while you can.</li>
|
||||||
<li>Tell someone you love them.</li>
|
<li>Tell someone you love them.</li>
|
||||||
</ol>
|
</ol>
|
||||||
<p>Finally, I’d like to shout out some people that I’m grateful for. This is non-exhaustive list, if I<br />
|
<p>Finally, I’d like to shout out some people that I’m grateful for. This is non-exhaustive list, if I
|
||||||
left you off, I’m sorry and please do not take it personally.</p>
|
left you off, I’m sorry and please do not take it personally.</p>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Bryan Orr
|
<li>Bryan Orr
|
||||||
<ul>
|
<ul>
|
||||||
<li>Bryan has cultivated an awesome group / community that I’m proud to be a part of. His time and<br />
|
<li>Bryan has cultivated an awesome group / community that I’m proud to be a part of. His time and
|
||||||
commitment to the HVAC industry is something that I hope he himself is proud of. Without Bryan,<br />
|
commitment to the HVAC industry is something that I hope he himself is proud of. Without Bryan,
|
||||||
mostly all the following names would not even be in my vocabulary.</li>
|
mostly all the following names would not even be in my vocabulary.</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li>Ty Branaman (forget exactly how to spell his last name).
|
<li>Ty Branaman (forget exactly how to spell his last name).
|
||||||
<ul>
|
<ul>
|
||||||
<li>Ty has such a great personality during his videos / training and I’m sure it’s a struggle to be<br />
|
<li>Ty has such a great personality during his videos / training and I’m sure it’s a struggle to be
|
||||||
positive all the time, however it brings me hope and joy everytime!</li>
|
positive all the time, however it brings me hope and joy everytime!</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li>Dustin (mother f’n) Cole
|
<li>Dustin (mother f’n) Cole
|
||||||
<ul>
|
<ul>
|
||||||
<li>Dustin is like a brother that I never had, he’s a true master of his craft and I know that I<br />
|
<li>Dustin is like a brother that I never had, he’s a true master of his craft and I know that I
|
||||||
can rely on him anytime I need it!</li>
|
can rely on him anytime I need it!</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li>Genry Garcia
|
<li>Genry Garcia
|
||||||
<ul>
|
<ul>
|
||||||
<li>The cuban crusader who has taught me so much about home performance, and especially ZPD (baby,<br />
|
<li>The cuban crusader who has taught me so much about home performance, and especially ZPD (baby,
|
||||||
baby)!</li>
|
baby)!</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li>Chris Hughes
|
<li>Chris Hughes
|
||||||
<ul>
|
<ul>
|
||||||
<li>It’s hard to put into words here, but I know that Chris is there to talk when I need it and<br />
|
<li>It’s hard to put into words here, but I know that Chris is there to talk when I need it and
|
||||||
he’s a great motivator because of his action items :)</li>
|
he’s a great motivator because of his action items :)</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li>Eric Kaiser
|
<li>Eric Kaiser
|
||||||
<ul>
|
<ul>
|
||||||
<li>I think genuine when I think of Eric, I hear his voice in my head when I write reports because<br />
|
<li>I think genuine when I think of Eric, I hear his voice in my head when I write reports because
|
||||||
of guidance he has given in the past. He truly wants to help teach people.</li>
|
of guidance he has given in the past. He truly wants to help teach people.</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
@@ -187,26 +187,26 @@ of guidance he has given in the past. He truly wants to help teach people.</li>
|
|||||||
</li>
|
</li>
|
||||||
<li>HVAChicks Jennifer (I’ll butcher her last name from memory)
|
<li>HVAChicks Jennifer (I’ll butcher her last name from memory)
|
||||||
<ul>
|
<ul>
|
||||||
<li>Jennifer is inspiring with her goals and everything she does to help anyone in the industry. I<br />
|
<li>Jennifer is inspiring with her goals and everything she does to help anyone in the industry. I
|
||||||
can’t wait to meet her in person one day soon!</li>
|
can’t wait to meet her in person one day soon!</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li>HVAC Overtime Crew
|
<li>HVAC Overtime Crew
|
||||||
<ul>
|
<ul>
|
||||||
<li>I’m lumping these guys together because I truly enjoy when I’m able to make their live stream<br />
|
<li>I’m lumping these guys together because I truly enjoy when I’m able to make their live stream
|
||||||
on Friday’s. And I interact with A-Team a lot and really appreciate him / them!</li>
|
on Friday’s. And I interact with A-Team a lot and really appreciate him / them!</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li>Alicia Hollon
|
<li>Alicia Hollon
|
||||||
<ul>
|
<ul>
|
||||||
<li>Alicia is so awesome to me, I mean she just made my favorite pancakes and sausage for dinner,<br />
|
<li>Alicia is so awesome to me, I mean she just made my favorite pancakes and sausage for dinner,
|
||||||
love you babe!</li>
|
love you babe!</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
<p>Lastly, I have to shout out to my mom. I know she’s going through a rough time with my aunt<br />
|
<p>Lastly, I have to shout out to my mom. I know she’s going through a rough time with my aunt
|
||||||
currently. My mother is the kindest gentlest soul that I’ve ever met. I look up to all 5’ of her!</p>
|
currently. My mother is the kindest gentlest soul that I’ve ever met. I look up to all 5’ of her!</p>
|
||||||
<p>At any rate, thanks for sticking it out to the end through my ramblings. Be kind to someone today<br />
|
<p>At any rate, thanks for sticking it out to the end through my ramblings. Be kind to someone today
|
||||||
and tomorrow!</p>
|
and tomorrow!</p>
|
||||||
</article>
|
</article>
|
||||||
<div class="border-t border-light mt-8 pt-8">
|
<div class="border-t border-light mt-8 pt-8">
|
||||||
@@ -242,7 +242,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2025-01-05-vapor-htmx-todo-app.png"/>
|
|
||||||
Build an example application using Vapor and HTMX.
|
Build an example application using Vapor and HTMX.
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -256,7 +255,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2024/free-as-in-freedom/"><div>
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2024-04-09-free-as-in-freedom.png"/>
|
|
||||||
Salute to open-source software engineers
|
Salute to open-source software engineers
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -287,6 +285,12 @@ Programming, Home-Performance, and Building Science
|
|||||||
|
|
|
|
||||||
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
</p>
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
196
deploy/articles/2023/why-mini-splits-stink/index.html
Normal file
196
deploy/articles/2023/why-mini-splits-stink/index.html
Normal file
@@ -0,0 +1,196 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<meta content="#0e1112" media="(prefers-color-scheme: dark)" name="theme-color"/>
|
||||||
|
<meta content="#566B78" media="(prefers-color-scheme: light)" name="theme-color"/>
|
||||||
|
<meta content="Michael Housh" name="author"/>
|
||||||
|
<meta content="Mhoush" name="apple-mobile-web-app-title"/>
|
||||||
|
<meta content="initial-scale=1.0, width=device-width" name="viewport"/>
|
||||||
|
<meta content="telephone=no" name="format-detection"/>
|
||||||
|
<meta content="True" name="HandheldFriendly"/>
|
||||||
|
<meta content="320" name="MobileOptimized"/>
|
||||||
|
<meta content="Mhoush" name="og:site_name"/>
|
||||||
|
<meta content="hvac, developer, swift, home-performance, design" name="keywords"/>
|
||||||
|
<title>
|
||||||
|
mhoush: Why Mini Splits Stink
|
||||||
|
</title>
|
||||||
|
<link href="/static/favicon.ico" rel="shortcut icon"/>
|
||||||
|
<link href="/static/output.css" rel="stylesheet"/>
|
||||||
|
<link href="/static/style.css" rel="stylesheet"/>
|
||||||
|
<link href="/articles/feed.xml" rel="alternate" title="mhoush" type="application/rss+xml"/>
|
||||||
|
<link href="/static/prism.css" rel="stylesheet"/>
|
||||||
|
<meta content="In this general article, I explain why I don’t generally like to use mini-splits.
|
||||||
|
The Positive Sides
|
||||||
|
When people say mini-splits, in general we mean “ductless” style units. These can either be high wall, floor mounted, or ceiling mounted
|
||||||
|
consoles...." name="description"/>
|
||||||
|
<meta content="summary_large_image" name="twitter:card"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-09-14-why-mini-splits-stink.png" name="twitter:image"/>
|
||||||
|
<meta content="Why Mini Splits Stink" name="twitter:image:alt"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images//articles/2023/why-mini-splits-stink/" name="og:url"/>
|
||||||
|
<meta content="Why Mini Splits Stink" name="og:title"/>
|
||||||
|
<meta content="In this general article, I explain why I don’t generally like to use mini-splits.
|
||||||
|
The Positive Sides
|
||||||
|
When people say mini-splits, in general we mean “ductless” style units. These can either be high wall, floor mounted, or ceiling mounted
|
||||||
|
consoles...." name="og:description"/>
|
||||||
|
<meta content="http://localhost:3000/articles/images/2023-09-14-why-mini-splits-stink.png" name="og:image"/>
|
||||||
|
<meta content="1014" name="og:image:width"/>
|
||||||
|
<meta content="530" name="og:image:height"/>
|
||||||
|
<script crossorigin="anonymous" src="https://kit.fontawesome.com/f209982030.js">
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body class="bg-page text-white pb-5 font-avenir articles">
|
||||||
|
<header class="bg-nav text-gray py-4 text-base/6 lg:fixed w-full lg:h-[62px]">
|
||||||
|
<nav class="container flex gap-x-5 lg:gap-x-y items-center">
|
||||||
|
<ul class="flex flex-wrap gap-x-2 lg:gap-x-5">
|
||||||
|
<li>
|
||||||
|
<a class href="/">Home</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="active" href="/articles/">Articles</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class href="/about/">About</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<div class="container pt-12 lg:pt-28">
|
||||||
|
<article class="prose">
|
||||||
|
<h1>
|
||||||
|
Why Mini Splits Stink
|
||||||
|
</h1>
|
||||||
|
<div class="-mt-6">
|
||||||
|
<div class="text-gray gray-links text-sm">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">September 14, 2023</span>758 words, posted in <a href="/articles/tag/hvac/">HVAC</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<img alt="banner" src="http://localhost:3000/articles/images/2023-09-14-why-mini-splits-stink.png"/>
|
||||||
|
<p>In this general article, I explain why I don’t generally like to use mini-splits.</p>
|
||||||
|
<h2>The Positive Sides</h2>
|
||||||
|
<p>When people say mini-splits, in general we mean “ductless” style units. These can either be high wall, floor mounted, or ceiling mounted
|
||||||
|
consoles. These units do offer really high efficiency and becuase they’re “ductless” you don’t have duct gains/losses.</p>
|
||||||
|
<p>These units are common in many other countries and have been around for a long time. They do are generally quick and fairly easy to install,
|
||||||
|
but are mostly a pain in the tail to work on.</p>
|
||||||
|
<p>So, the plus side to these units are that they are really efficient, they generally have models that have a high-heat output for colder
|
||||||
|
climates, although this option is becoming more prevelant in traditional unitary style heat pumps as well. You do not have heat gains or
|
||||||
|
losses due to ductwork being in unconditioned spaces.</p>
|
||||||
|
<h2>The Down Sides</h2>
|
||||||
|
<p>Most mini-split systems do not do the greatest at humidity removal. This is partially because they use proprietary algorithms to control the
|
||||||
|
blower and compressor. They do achieve long run-times, which is often good for comfort stand points, however there is generally not a good
|
||||||
|
way to control / hack them to work towards achieving good IAQ.</p>
|
||||||
|
<p>These units offer next to no filtration, so in order to have filtration you need to utilize a stand-alone / portable filtration means. Which
|
||||||
|
a lot of the portable filtration systems have problems of their own (come bundled with UV / PCO technology or other “space” technology that
|
||||||
|
can lead to their own IAQ problems). It also introduces another fan, which may / may not be that efficient. In other words, when considering
|
||||||
|
other items to make them more comparable to what a traditional system offers, are they really that much more efficient?</p>
|
||||||
|
<p>These systems also do not have a good method of offering basic fresh air control / management, so other systems, such as an ERV need to be
|
||||||
|
installed to handle the fresh air requirements of the building.</p>
|
||||||
|
<p>The controls for these systems are often hard to understand / use. They do allow you to change fan speeds, but they control the compressor.
|
||||||
|
The fans often run all the time, which is not necessarily a bad thing, but they don’t really offer many ramping profiles or adjustments to
|
||||||
|
change the blower speed when the compressor is off vs. on.</p>
|
||||||
|
<p>These systems get dirty quickly, are generally a pain to clean properly, and are not easily repairable. Manufacturer support is often poor,
|
||||||
|
the documents aren’t always translated very well, and most technicians hate to work on them.</p>
|
||||||
|
<h1>What about ducted models?</h1>
|
||||||
|
<p>But what about the ducted models? Well, the ducted models are a step in the right direction. You can use filters on them, although some of
|
||||||
|
the manufacturer’s do not recommend installing better / improved filter cabinets (like a 4-5” media filter), however we have done that
|
||||||
|
successfully many times and always include media filters as an option on our installations, but you do need to make sure that they have a
|
||||||
|
very low pressure drop, as they a lot are not designed for very much static pressure.</p>
|
||||||
|
<p>The ducted models still generally have the same control problems, previously mentioned. If you read my introduction to the
|
||||||
|
<a href="https://mhoush.com/posts/coil-bypass-overview/">coil-bypass-system</a>, you have a basic understanding that even most traditional systems /
|
||||||
|
designers do not focus on the proper air-changes in a structure to maintain proper IAQ levels.</p>
|
||||||
|
<p>You can’t easily pair mini-splits with larger fan-coils because they are “communicating” style systems.</p>
|
||||||
|
<h2>Conclusion</h2>
|
||||||
|
<p>Don’t get me wrong, there are applications that are well suited for mini-splits. These are often applications like sun-rooms, garages, small
|
||||||
|
server-rooms / network storage rooms, and many others. But in my opinion these are not at all my favorite and are generally really far down
|
||||||
|
my list of options that I want to recommend to my clients.</p>
|
||||||
|
<p>As an industry, I feel we need to step back and refocus on the pillars of IAQ. Filtration, fresh-air, and humidity control. The
|
||||||
|
manufacturers / government should put less emphasis on chasing efficiency just to shoot ourselves in the foot and loose the qualities that
|
||||||
|
make traditional / unitary style systems cover more if not all of the 3 pillars of proper IAQ.</p>
|
||||||
|
<p>There’s plenty that I did not cover and I’m sure I missed some things, but just needed to rant for a few minutes… Thank you for making it
|
||||||
|
to the end!</p>
|
||||||
|
</article>
|
||||||
|
<div class="border-t border-light mt-8 pt-8">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
Written by
|
||||||
|
</h2>
|
||||||
|
<div class="flex flex-col lg:flex-row gap-8">
|
||||||
|
<div class="flex-[0_0_120px]">
|
||||||
|
<img class="w-[120px] h-[120px] rounded-full" src="/static/images/avatar.png"/>
|
||||||
|
</div>
|
||||||
|
<div class="prose">
|
||||||
|
<h3 class="!m-0">
|
||||||
|
Michael Housh
|
||||||
|
</h3>
|
||||||
|
<p class="text-gray">
|
||||||
|
HVAC business owner with over 27 years of experience. Writes articles about HVAC,
|
||||||
|
Programming, Home-Performance, and Building Science
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-16">
|
||||||
|
<h2 class="text-4xl font-extrabold mb-8">
|
||||||
|
More articles
|
||||||
|
</h2>
|
||||||
|
<div class="grid lg:grid-cols-2 gap-10">
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2025/vapor-htmx-todo-app/">Vapor + HTMX</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">January 05, 2025</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/programming/">programming</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
|
Build an example application using Vapor and HTMX.
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl font-bold mb-2">
|
||||||
|
<a class="[&:hover]:border-b border-orange" href="/articles/2024/free-as-in-freedom/">Free As In Freedom</a>
|
||||||
|
</h2>
|
||||||
|
<div class="text-gray gray-links text-sm mb-4">
|
||||||
|
<span class="border-r border-gray pr-2 mr-2">April 09, 2024</span><a href="/articles/tag/general/">general</a>, <a href="/articles/tag/open-source/">open-source</a> and <a href="/articles/tag/software/">software</a>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
|
Salute to open-source software engineers
|
||||||
|
</div></a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
<p class="prose mt-8">
|
||||||
|
<a href="/articles/">› See all articles</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="site-footer container text-gray gray-links border-t border-light text-center pt-6 mt-8 text-sm">
|
||||||
|
<p>
|
||||||
|
Copyright © Michael Housh 2023-2025.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Built in Swift using
|
||||||
|
<a href="https://github.com/loopwerk/Saga" rel="nofollow" target="_blank">Saga</a>
|
||||||
|
(<a href="https://github.com/m-housh/mhoush.com" rel="nofollow" target="_blank">source</a>).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a href="http://localhost:3000/articles/feed.xml" rel="nofollow" target="_blank">RSS</a>
|
||||||
|
|
|
||||||
|
<a href="https://github.com/m-housh" rel="nofollow" target="_blank">Github</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.youtube.com/channel/UCb58SeURd5bObfTiL0KoliA" rel="nofollow" target="_blank">Youtube</a>
|
||||||
|
|
|
||||||
|
<a href="https://www.facebook.com/michael.housh" rel="nofollow" target="_blank">Facebook</a>
|
||||||
|
|
|
||||||
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -68,25 +68,25 @@ converted to other formats, such as html, pdf, docx, and many more. All..." name
|
|||||||
<img alt="banner" src="http://localhost:3000/articles/images/2023-10-21-you-should-learn-markdown.png"/>
|
<img alt="banner" src="http://localhost:3000/articles/images/2023-10-21-you-should-learn-markdown.png"/>
|
||||||
<p>This is a quick article about why you should learn markdown.</p>
|
<p>This is a quick article about why you should learn markdown.</p>
|
||||||
<h2>What is markdown</h2>
|
<h2>What is markdown</h2>
|
||||||
<p>Markdown is a “mark-up” language. It allows you to write content in plain text that can be easily<br />
|
<p>Markdown is a “mark-up” language. It allows you to write content in plain text that can be easily
|
||||||
converted to other formats, such as <strong>html, pdf, docx</strong>, and many more. All the articles written on<br />
|
converted to other formats, such as <strong>html, pdf, docx</strong>, and many more. All the articles written on
|
||||||
this website are written in markdown, here’s an image of this article written in markdown.</p>
|
this website are written in markdown, here’s an image of this article written in markdown.</p>
|
||||||
<p><img src="/articles/images/2023-10-21-markdown.png" alt="markdown" /></p>
|
<p><img src="/articles/images/2023-10-21-markdown.png" alt="markdown" /></p>
|
||||||
<p>The reason you should learn markdown is that it allows you to focus on the content / text of your<br />
|
<p>The reason you should learn markdown is that it allows you to focus on the content / text of your
|
||||||
content with simple concepts for formatting. Markdown is used heavily in documenting software<br />
|
content with simple concepts for formatting. Markdown is used heavily in documenting software
|
||||||
projects, which is how I got introduced to it, however it can scale all the way up to writing<br />
|
projects, which is how I got introduced to it, however it can scale all the way up to writing
|
||||||
research papers or even books.</p>
|
research papers or even books.</p>
|
||||||
<p>I use markdown for probably 80% of all the text documents I need to write, from company documents,<br />
|
<p>I use markdown for probably 80% of all the text documents I need to write, from company documents,
|
||||||
web / software documentation, and so on. It allows me to get content out quickly without having to<br />
|
web / software documentation, and so on. It allows me to get content out quickly without having to
|
||||||
click around with formatting options in a program like <strong>Word</strong> or <strong>Pages</strong>. To be clear, a lot of<br />
|
click around with formatting options in a program like <strong>Word</strong> or <strong>Pages</strong>. To be clear, a lot of
|
||||||
the reports and things I generate for my <strong>Home Performance Assessments</strong> are written using<br />
|
the reports and things I generate for my <strong>Home Performance Assessments</strong> are written using
|
||||||
<strong>Pages</strong> (for now at least) because I have templates that make the documents look more<br />
|
<strong>Pages</strong> (for now at least) because I have templates that make the documents look more
|
||||||
professional, however I am working on solutions to migrate those to be markdown based.</p>
|
professional, however I am working on solutions to migrate those to be markdown based.</p>
|
||||||
<p>Markdown is supported in mostly all the <strong>Google</strong> tools, as well as the <strong>Outlook</strong> email client<br />
|
<p>Markdown is supported in mostly all the <strong>Google</strong> tools, as well as the <strong>Outlook</strong> email client
|
||||||
(which is one of my least favorite tools, BTW). It makes it simple to create tables, lists, and many<br />
|
(which is one of my least favorite tools, BTW). It makes it simple to create tables, lists, and many
|
||||||
common document related tasks.</p>
|
common document related tasks.</p>
|
||||||
<h2>Resources</h2>
|
<h2>Resources</h2>
|
||||||
<p>You can learn more about the syntax used for markdown at<br />
|
<p>You can learn more about the syntax used for markdown at
|
||||||
<a href="https://www.markdownguide.org/basic-syntax/">markdownguide.org</a>.</p>
|
<a href="https://www.markdownguide.org/basic-syntax/">markdownguide.org</a>.</p>
|
||||||
<h3>A non-exhaustive list of where you can use Markdown and editors.</h3>
|
<h3>A non-exhaustive list of where you can use Markdown and editors.</h3>
|
||||||
<table>
|
<table>
|
||||||
@@ -118,7 +118,7 @@ common document related tasks.</p>
|
|||||||
<p>You can use tools such as <a href="https://pandoc.org/#">pandoc</a> to convert Markdown files to other formats.</p>
|
<p>You can use tools such as <a href="https://pandoc.org/#">pandoc</a> to convert Markdown files to other formats.</p>
|
||||||
<p><img src="/articles/images/2023-10-21-pandoc.gif" alt="pandoc" /></p>
|
<p><img src="/articles/images/2023-10-21-pandoc.gif" alt="pandoc" /></p>
|
||||||
<h2>Conclusion</h2>
|
<h2>Conclusion</h2>
|
||||||
<p>I hope that you take the time to research and see if Markdown is good fit for your document /<br />
|
<p>I hope that you take the time to research and see if Markdown is good fit for your document /
|
||||||
content creation.</p>
|
content creation.</p>
|
||||||
<p>Thanks for reading until the end!</p>
|
<p>Thanks for reading until the end!</p>
|
||||||
</article>
|
</article>
|
||||||
@@ -155,7 +155,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2025-01-05-vapor-htmx-todo-app.png"/>
|
|
||||||
Build an example application using Vapor and HTMX.
|
Build an example application using Vapor and HTMX.
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -169,7 +168,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2024/free-as-in-freedom/"><div>
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2024-04-09-free-as-in-freedom.png"/>
|
|
||||||
Salute to open-source software engineers
|
Salute to open-source software engineers
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -200,6 +198,12 @@ Programming, Home-Performance, and Building Science
|
|||||||
|
|
|
|
||||||
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
</p>
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -68,50 +68,50 @@ job, overshadowing the intricate skill set and technical expertise required in..
|
|||||||
<img alt="banner" src="http://localhost:3000/articles/images/2024-02-27-elevating-hvac.png"/>
|
<img alt="banner" src="http://localhost:3000/articles/images/2024-02-27-elevating-hvac.png"/>
|
||||||
<p>This is a guest post from my good friend, <strong>Ty Branaman</strong>.</p>
|
<p>This is a guest post from my good friend, <strong>Ty Branaman</strong>.</p>
|
||||||
<h2>Introduction:</h2>
|
<h2>Introduction:</h2>
|
||||||
<p>Heating, Ventilation, and Air Conditioning (HVAC) is often mistakenly categorized as a simple labor<br />
|
<p>Heating, Ventilation, and Air Conditioning (HVAC) is often mistakenly categorized as a simple labor
|
||||||
job, overshadowing the intricate skill set and technical expertise required in this field. Labor<br />
|
job, overshadowing the intricate skill set and technical expertise required in this field. Labor
|
||||||
jobs are also very important positions needed to keep society running. HVAC, like other skilled<br />
|
jobs are also very important positions needed to keep society running. HVAC, like other skilled
|
||||||
trades, demands a high level of knowledge, precision, and adaptability. This article aims to shed<br />
|
trades, demands a high level of knowledge, precision, and adaptability. This article aims to shed
|
||||||
light on the misconception surrounding HVAC, emphasizing its status as a skilled trade that plays a<br />
|
light on the misconception surrounding HVAC, emphasizing its status as a skilled trade that plays a
|
||||||
pivotal role in creating comfortable and efficient living and working environments.</p>
|
pivotal role in creating comfortable and efficient living and working environments.</p>
|
||||||
<h2>Technical Proficiency:</h2>
|
<h2>Technical Proficiency:</h2>
|
||||||
<p>One of the defining features that distinguish HVAC as a skilled trade is the level of technical<br />
|
<p>One of the defining features that distinguish HVAC as a skilled trade is the level of technical
|
||||||
proficiency required. HVAC professionals must have a deep understanding of thermodynamics, fluid<br />
|
proficiency required. HVAC professionals must have a deep understanding of thermodynamics, fluid
|
||||||
mechanics, electrical circuits, Psychrometrics and air properties. This knowledge is essential for<br />
|
mechanics, electrical circuits, Psychrometrics and air properties. This knowledge is essential for
|
||||||
designing, installing, and maintaining HVAC systems that operate seamlessly and efficiently.</p>
|
designing, installing, and maintaining HVAC systems that operate seamlessly and efficiently.</p>
|
||||||
<h2>System Design and Installation:</h2>
|
<h2>System Design and Installation:</h2>
|
||||||
<p>HVAC professionals are involved in the intricate process of designing and installing heating,<br />
|
<p>HVAC professionals are involved in the intricate process of designing and installing heating,
|
||||||
ventilation, and air conditioning systems. This task requires not only a thorough understanding of<br />
|
ventilation, and air conditioning systems. This task requires not only a thorough understanding of
|
||||||
the physical principles governing HVAC but also the ability to tailor solutions to meet the unique<br />
|
the physical principles governing HVAC but also the ability to tailor solutions to meet the unique
|
||||||
needs of each space. Proper system design and installation are crucial for achieving optimal energy<br />
|
needs of each space. Proper system design and installation are crucial for achieving optimal energy
|
||||||
efficiency and performance.</p>
|
efficiency and performance.</p>
|
||||||
<h2>Diagnostic Skills:</h2>
|
<h2>Diagnostic Skills:</h2>
|
||||||
<p>Troubleshooting and diagnosing issues in HVAC systems require a keen analytical mind and<br />
|
<p>Troubleshooting and diagnosing issues in HVAC systems require a keen analytical mind and
|
||||||
problem-solving skills. Skilled HVAC technicians possess the ability to identify and rectify<br />
|
problem-solving skills. Skilled HVAC technicians possess the ability to identify and rectify
|
||||||
problems efficiently, ensuring minimal downtime and disruption to the comfort of occupants. This<br />
|
problems efficiently, ensuring minimal downtime and disruption to the comfort of occupants. This
|
||||||
diagnostic acumen is a hallmark of a trade that goes beyond routine labor.</p>
|
diagnostic acumen is a hallmark of a trade that goes beyond routine labor.</p>
|
||||||
<h2>Adaptability to Advanced Technologies:</h2>
|
<h2>Adaptability to Advanced Technologies:</h2>
|
||||||
<p>The HVAC industry is in a constant state of evolution, with new technologies and innovations<br />
|
<p>The HVAC industry is in a constant state of evolution, with new technologies and innovations
|
||||||
continuously being introduced. Skilled HVAC professionals are adaptable and stay abreast of these<br />
|
continuously being introduced. Skilled HVAC professionals are adaptable and stay abreast of these
|
||||||
advancements. From smart thermostats to energy-efficient systems, they integrate cutting-edge<br />
|
advancements. From smart thermostats to energy-efficient systems, they integrate cutting-edge
|
||||||
technologies to provide state-of-the-art solutions for their clients.</p>
|
technologies to provide state-of-the-art solutions for their clients.</p>
|
||||||
<h2>Safety and Compliance:</h2>
|
<h2>Safety and Compliance:</h2>
|
||||||
<p>Safety is paramount in the HVAC trade. Professionals must adhere to strict safety protocols to<br />
|
<p>Safety is paramount in the HVAC trade. Professionals must adhere to strict safety protocols to
|
||||||
protect both themselves and the occupants of the spaces they work in. Additionally, compliance with<br />
|
protect both themselves and the occupants of the spaces they work in. Additionally, compliance with
|
||||||
industry regulations and codes is a testament to the skilled nature of the trade, ensuring that HVAC<br />
|
industry regulations and codes is a testament to the skilled nature of the trade, ensuring that HVAC
|
||||||
systems meet the highest standards of safety and efficiency.</p>
|
systems meet the highest standards of safety and efficiency.</p>
|
||||||
<h2>Continual Learning and Certification:</h2>
|
<h2>Continual Learning and Certification:</h2>
|
||||||
<p>Unlike a labor job, HVAC professionals engage in continual learning to stay current with industry<br />
|
<p>Unlike a labor job, HVAC professionals engage in continual learning to stay current with industry
|
||||||
trends and technological advancements. Many pursue certifications and attend training programs to<br />
|
trends and technological advancements. Many pursue certifications and attend training programs to
|
||||||
enhance their skills and expand their knowledge base. This commitment to ongoing education is a<br />
|
enhance their skills and expand their knowledge base. This commitment to ongoing education is a
|
||||||
hallmark of skilled trades.</p>
|
hallmark of skilled trades.</p>
|
||||||
<h2>Conclusion:</h2>
|
<h2>Conclusion:</h2>
|
||||||
<p>Heating, Ventilation, and Air Conditioning is undeniably a skilled trade that goes beyond the<br />
|
<p>Heating, Ventilation, and Air Conditioning is undeniably a skilled trade that goes beyond the
|
||||||
perception of a labor job. Labor jobs are also very important to the function of society and I have<br />
|
perception of a labor job. Labor jobs are also very important to the function of society and I have
|
||||||
proudly done these jobs myself. The technical proficiency, problem-solving abilities, adaptability,<br />
|
proudly done these jobs myself. The technical proficiency, problem-solving abilities, adaptability,
|
||||||
and commitment to safety make HVAC professionals essential contributors to the creation of<br />
|
and commitment to safety make HVAC professionals essential contributors to the creation of
|
||||||
comfortable and efficient indoor environments. It is crucial to recognize and appreciate the skill<br />
|
comfortable and efficient indoor environments. It is crucial to recognize and appreciate the skill
|
||||||
set inherent in the HVAC trade, as it plays a vital role in shaping the quality of life for<br />
|
set inherent in the HVAC trade, as it plays a vital role in shaping the quality of life for
|
||||||
individuals and the functionality of diverse spaces.</p>
|
individuals and the functionality of diverse spaces.</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Ty Branaman</li>
|
<li>Ty Branaman</li>
|
||||||
@@ -150,7 +150,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2025-01-05-vapor-htmx-todo-app.png"/>
|
|
||||||
Build an example application using Vapor and HTMX.
|
Build an example application using Vapor and HTMX.
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -164,7 +163,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2024/free-as-in-freedom/"><div>
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2024-04-09-free-as-in-freedom.png"/>
|
|
||||||
Salute to open-source software engineers
|
Salute to open-source software engineers
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -195,6 +193,12 @@ Programming, Home-Performance, and Building Science
|
|||||||
|
|
|
|
||||||
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
</p>
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -62,67 +62,67 @@
|
|||||||
<img alt="banner" src="http://localhost:3000/articles/images/2024-04-09-free-as-in-freedom.png"/>
|
<img alt="banner" src="http://localhost:3000/articles/images/2024-04-09-free-as-in-freedom.png"/>
|
||||||
<p>This is a hot take kind of article, but here it goes the rant.</p>
|
<p>This is a hot take kind of article, but here it goes the rant.</p>
|
||||||
<h2>This applies to me and you.</h2>
|
<h2>This applies to me and you.</h2>
|
||||||
<p>I’m writing this to remind myself somethings that I too often take for granted. I am going to<br />
|
<p>I’m writing this to remind myself somethings that I too often take for granted. I am going to
|
||||||
preface this whole article by saying that everything I’m going to lay out / mention is something<br />
|
preface this whole article by saying that everything I’m going to lay out / mention is something
|
||||||
that I am personally guilty of. This is an open reminder and call out of things that I feel should<br />
|
that I am personally guilty of. This is an open reminder and call out of things that I feel should
|
||||||
change.</p>
|
change.</p>
|
||||||
<h1>Our perspective is flawed</h1>
|
<h1>Our perspective is flawed</h1>
|
||||||
<p>Nobody can dispute that the advances in technology have greatly improved our lives. Like anything,<br />
|
<p>Nobody can dispute that the advances in technology have greatly improved our lives. Like anything,
|
||||||
though, there is a trade off.</p>
|
though, there is a trade off.</p>
|
||||||
<h2>What is FOSS</h2>
|
<h2>What is FOSS</h2>
|
||||||
<p>FOSS is an acronym for “Free and Open Source Software”. It is generally about how software is<br />
|
<p>FOSS is an acronym for “Free and Open Source Software”. It is generally about how software is
|
||||||
licensed, meaning that the source code is available in the public for review, allowing a broader<br />
|
licensed, meaning that the source code is available in the public for review, allowing a broader
|
||||||
spectrum of people than the originators of the code to have input, look for bugs, redistribute the<br />
|
spectrum of people than the originators of the code to have input, look for bugs, redistribute the
|
||||||
software, contribute, etc. It does not however mean that the software should be no cost to the end<br />
|
software, contribute, etc. It does not however mean that the software should be no cost to the end
|
||||||
user.</p>
|
user.</p>
|
||||||
<p>This is where the word “freedom” comes into it. Overtime, as a society, we generally now think of<br />
|
<p>This is where the word “freedom” comes into it. Overtime, as a society, we generally now think of
|
||||||
FOSS as “free” software. This takes what was originally a noble / courageous idea and devalues it to<br />
|
FOSS as “free” software. This takes what was originally a noble / courageous idea and devalues it to
|
||||||
the point that we now expect things to be free. It encourages corporate greed to take advantage of<br />
|
the point that we now expect things to be free. It encourages corporate greed to take advantage of
|
||||||
people who created something to solve a particular need, or as a hobby, expecting the creator to<br />
|
people who created something to solve a particular need, or as a hobby, expecting the creator to
|
||||||
handle the burden of maintaining / patching bugs while they profit from it. Don’t get me wrong,<br />
|
handle the burden of maintaining / patching bugs while they profit from it. Don’t get me wrong,
|
||||||
these corporations will also contribute back, sometimes even donate money to the creators. I am not<br />
|
these corporations will also contribute back, sometimes even donate money to the creators. I am not
|
||||||
at all opposed to capitalism, nor saying that these corporations are in the wrong. At the end of the<br />
|
at all opposed to capitalism, nor saying that these corporations are in the wrong. At the end of the
|
||||||
day, <strong><em>we</em></strong> created this problem.</p>
|
day, <strong><em>we</em></strong> created this problem.</p>
|
||||||
<h2>Current state and how we got here</h2>
|
<h2>Current state and how we got here</h2>
|
||||||
<p>Software services / giants create applications that we come to rely on. They tempt / bait us with<br />
|
<p>Software services / giants create applications that we come to rely on. They tempt / bait us with
|
||||||
them being “free” or cheap, but that is because <strong><em>we</em></strong> are their target. They bloat the software<br />
|
them being “free” or cheap, but that is because <strong><em>we</em></strong> are their target. They bloat the software
|
||||||
with tracking and telemetry to capture data about us and sell us more products and services. Once<br />
|
with tracking and telemetry to capture data about us and sell us more products and services. Once
|
||||||
again, if you’re pro-capitalism, it’s somewhat hard to blame them for this. We’re the gullible sheep<br />
|
again, if you’re pro-capitalism, it’s somewhat hard to blame them for this. We’re the gullible sheep
|
||||||
who will blindly eat out their grain bins.</p>
|
who will blindly eat out their grain bins.</p>
|
||||||
<p>I can remember back in the day when there were music pirating services on the internet (napster is<br />
|
<p>I can remember back in the day when there were music pirating services on the internet (napster is
|
||||||
the one that comes to mind). As a giant music buff, I quickly jumped on board with services like<br />
|
the one that comes to mind). As a giant music buff, I quickly jumped on board with services like
|
||||||
these. Back in those days, I was young, didn’t make very much money, so it was hard to afford the<br />
|
these. Back in those days, I was young, didn’t make very much money, so it was hard to afford the
|
||||||
latest and greatest tunes. I also remember back in this time frame a lawsuit from the metal giants<br />
|
latest and greatest tunes. I also remember back in this time frame a lawsuit from the metal giants
|
||||||
Metallica (other’s words not mine ;)). At the time I remember thinking, like many others, that<br />
|
Metallica (other’s words not mine ;)). At the time I remember thinking, like many others, that
|
||||||
Metallica didn’t need the money, but then a comment from Lars Ulrich the band’s drummer struck a<br />
|
Metallica didn’t need the money, but then a comment from Lars Ulrich the band’s drummer struck a
|
||||||
cord with me (pun intended). I’ll will paraphrase here, but it was something along the lines of<br />
|
cord with me (pun intended). I’ll will paraphrase here, but it was something along the lines of
|
||||||
“We’re not pursuing this for us, but for all of those (musicians) that come after us”. After this<br />
|
“We’re not pursuing this for us, but for all of those (musicians) that come after us”. After this
|
||||||
and reflection, I decided that I would not pirate music anymore.</p>
|
and reflection, I decided that I would not pirate music anymore.</p>
|
||||||
<p>Fast forward, now the majority do not purchases music / albums, we typically utilize streaming<br />
|
<p>Fast forward, now the majority do not purchases music / albums, we typically utilize streaming
|
||||||
services (myself included), sure it may be more fair to the artists than pirating was, it can be<br />
|
services (myself included), sure it may be more fair to the artists than pirating was, it can be
|
||||||
argued that it’s easier today for independent artists to become known / discovered, I’m also in no<br />
|
argued that it’s easier today for independent artists to become known / discovered, I’m also in no
|
||||||
way saying the old school music industry wasn’t a giant pile of dog poo, but I am saying that who is<br />
|
way saying the old school music industry wasn’t a giant pile of dog poo, but I am saying that who is
|
||||||
really winning(?), it’s the Spotify’s and Apple Music’s of the world, that’s who.</p>
|
really winning(?), it’s the Spotify’s and Apple Music’s of the world, that’s who.</p>
|
||||||
<p>I’m also reminded of the great “MeasureQuick is now charging for services” that happened in the HVAC<br />
|
<p>I’m also reminded of the great “MeasureQuick is now charging for services” that happened in the HVAC
|
||||||
industry. I have personally never complained and have always supported this decision, because it is<br />
|
industry. I have personally never complained and have always supported this decision, because it is
|
||||||
not sustainable to run a software company and not charge for services, generally. Sure, you may not<br />
|
not sustainable to run a software company and not charge for services, generally. Sure, you may not
|
||||||
like their pricing model, etc. Where I think they went wrong was not charging from the beginning, as<br />
|
like their pricing model, etc. Where I think they went wrong was not charging from the beginning, as
|
||||||
it sets the wrong expectation that is presumably hard to recover from. There are those who took some<br />
|
it sets the wrong expectation that is presumably hard to recover from. There are those who took some
|
||||||
of Jim’s words / opinions in a way different from how I do / did, which is fine, we’re all entitled<br />
|
of Jim’s words / opinions in a way different from how I do / did, which is fine, we’re all entitled
|
||||||
to our opinions. What is often forgotten is that we’re all also entitled to change those opinions.<br />
|
to our opinions. What is often forgotten is that we’re all also entitled to change those opinions.
|
||||||
Heck, I will probably be shouting a different story tomorrow, so be it!</p>
|
Heck, I will probably be shouting a different story tomorrow, so be it!</p>
|
||||||
<h2>Conclusion</h2>
|
<h2>Conclusion</h2>
|
||||||
<p>What I would like to encourage people to do is to support software development. If an application is<br />
|
<p>What I would like to encourage people to do is to support software development. If an application is
|
||||||
free, but has a donate button consider giving a donation. If an application is free and they don’t<br />
|
free, but has a donate button consider giving a donation. If an application is free and they don’t
|
||||||
want to charge that’s fine too, however I would say to be suspicous, meaning is it free because<br />
|
want to charge that’s fine too, however I would say to be suspicous, meaning is it free because
|
||||||
<strong><em>you</em></strong> are the product?!?</p>
|
<strong><em>you</em></strong> are the product?!?</p>
|
||||||
<p>I would also encourage you to be active in communities and organizations that foster community (HVAC<br />
|
<p>I would also encourage you to be active in communities and organizations that foster community (HVAC
|
||||||
School is a great example). Show appreciation and encouragement, but at the same time don’t be<br />
|
School is a great example). Show appreciation and encouragement, but at the same time don’t be
|
||||||
afraid to be critical or speak up.</p>
|
afraid to be critical or speak up.</p>
|
||||||
<p>At the end of the day, I hope to lift up my brothers and sisters, help to fight against the<br />
|
<p>At the end of the day, I hope to lift up my brothers and sisters, help to fight against the
|
||||||
corporations who abuse the little guy’s and hopefully feel good about my decisions.</p>
|
corporations who abuse the little guy’s and hopefully feel good about my decisions.</p>
|
||||||
<p>Over the last few weeks, I have been going through my software and services and looking for those<br />
|
<p>Over the last few weeks, I have been going through my software and services and looking for those
|
||||||
donation buttons and giving back a little bit for the software that makes my life better. Help<br />
|
donation buttons and giving back a little bit for the software that makes my life better. Help
|
||||||
change the narrative and remember that it’s about <strong><em>Freedom not Free</em></strong>.</p>
|
change the narrative and remember that it’s about <strong><em>Freedom not Free</em></strong>.</p>
|
||||||
<h3>Links</h3>
|
<h3>Links</h3>
|
||||||
<ul>
|
<ul>
|
||||||
@@ -137,7 +137,7 @@ change the narrative and remember that it’s about <strong><em>Freedom not Free
|
|||||||
<li><a href="https://themes.gohugo.io/themes/poison/">Hugo Theme</a></li>
|
<li><a href="https://themes.gohugo.io/themes/poison/">Hugo Theme</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p><strong>Note:</strong> I do not use any trackers or analytics on this site to respect your privacy. So feel<br />
|
<p><strong>Note:</strong> I do not use any trackers or analytics on this site to respect your privacy. So feel
|
||||||
free to contact me directly to share feedback or let me know how I’m doing.</p>
|
free to contact me directly to share feedback or let me know how I’m doing.</p>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
</article>
|
</article>
|
||||||
@@ -174,7 +174,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2025-01-05-vapor-htmx-todo-app.png"/>
|
|
||||||
Build an example application using Vapor and HTMX.
|
Build an example application using Vapor and HTMX.
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -188,7 +187,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2024/pgp-encryption-introduction/"><div>
|
<a href="/articles/2024/pgp-encryption-introduction/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2024-04-04-pgp-encryption-introduction.gif"/>
|
|
||||||
In this article I introduce PGP and show a use case for me, which perhaps you can use as well.
|
In this article I introduce PGP and show a use case for me, which perhaps you can use as well.
|
||||||
What is PGP
|
What is PGP
|
||||||
PGP stands for Pretty Good Privacy, it was first developed in 1991 by Phil Zimmermann. PGP uses
|
PGP stands for Pretty Good Privacy, it was first developed in 1991 by Phil Zimmermann. PGP uses
|
||||||
@@ -222,6 +220,12 @@ cryptographic privacy and authentication and is...
|
|||||||
|
|
|
|
||||||
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
</p>
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -110,6 +110,12 @@ job, overshadowing the intricate skill set and technical expertise required in..
|
|||||||
|
|
|
|
||||||
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
</p>
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -68,67 +68,67 @@ cryptographic privacy and authentication and is..." name="og:description"/>
|
|||||||
<img alt="banner" src="http://localhost:3000/articles/images/2024-04-04-pgp-encryption-introduction.gif"/>
|
<img alt="banner" src="http://localhost:3000/articles/images/2024-04-04-pgp-encryption-introduction.gif"/>
|
||||||
<p>In this article I introduce PGP and show a use case for me, which perhaps you can use as well.</p>
|
<p>In this article I introduce PGP and show a use case for me, which perhaps you can use as well.</p>
|
||||||
<h2>What is PGP</h2>
|
<h2>What is PGP</h2>
|
||||||
<p>PGP stands for <strong>Pretty Good Privacy</strong>, it was first developed in 1991 by Phil Zimmermann. PGP uses<br />
|
<p>PGP stands for <strong>Pretty Good Privacy</strong>, it was first developed in 1991 by Phil Zimmermann. PGP uses
|
||||||
cryptographic privacy and authentication and is generally used in data communication.</p>
|
cryptographic privacy and authentication and is generally used in data communication.</p>
|
||||||
<p>According to <a href="https://en.wikipedia.org/wiki/Pretty_Good_Privacy">Wikipedia</a> it’s name was inspired<br />
|
<p>According to <a href="https://en.wikipedia.org/wiki/Pretty_Good_Privacy">Wikipedia</a> it’s name was inspired
|
||||||
by a grocery store named, “Ralph’s Pretty Goody Grocery” featured in radio host’s Garrison Keillor’s<br />
|
by a grocery store named, “Ralph’s Pretty Goody Grocery” featured in radio host’s Garrison Keillor’s
|
||||||
fictional town of Lake Wobegon.</p>
|
fictional town of Lake Wobegon.</p>
|
||||||
<p>PGP is commonly used in software development to “sign” software commits or files to help ensure both<br />
|
<p>PGP is commonly used in software development to “sign” software commits or files to help ensure both
|
||||||
who the commits were from as well as make sure they were not modified from the original versions.</p>
|
who the commits were from as well as make sure they were not modified from the original versions.</p>
|
||||||
<p>It should also be noted that when people say PGP they are often referring to OpenPGP or GnuPGP which<br />
|
<p>It should also be noted that when people say PGP they are often referring to OpenPGP or GnuPGP which
|
||||||
are implementations of the PGP standard protocol.</p>
|
are implementations of the PGP standard protocol.</p>
|
||||||
<h2>What it does</h2>
|
<h2>What it does</h2>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>Note: I am in no way a cyber-security expert, I am a layman and only describing things in terms<br />
|
<p>Note: I am in no way a cyber-security expert, I am a layman and only describing things in terms
|
||||||
that I understand / make sense to me. Do what I do at your own risk!</p>
|
that I understand / make sense to me. Do what I do at your own risk!</p>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<p>PGP offers both symmetrical encryption (uses a session key and password) or asymmetrical encryption<br />
|
<p>PGP offers both symmetrical encryption (uses a session key and password) or asymmetrical encryption
|
||||||
(uses a session key and a private key). Asymmetrical encryption is more secure but is more resource<br />
|
(uses a session key and a private key). Asymmetrical encryption is more secure but is more resource
|
||||||
intensive (which is generally not a problem with computers of today).</p>
|
intensive (which is generally not a problem with computers of today).</p>
|
||||||
<p>Generally speaking PGP uses what are known as public and private key pairs. The public portion of<br />
|
<p>Generally speaking PGP uses what are known as public and private key pairs. The public portion of
|
||||||
the key par is meant to be shared with others freely, while the private portion needs to be secured<br />
|
the key par is meant to be shared with others freely, while the private portion needs to be secured
|
||||||
/ not shared with anyone <strong>EVER</strong>. It is best practice to generate your keys on a computer that is<br />
|
/ not shared with anyone <strong>EVER</strong>. It is best practice to generate your keys on a computer that is
|
||||||
“air gapped”, meaning it is not connected to any network / internet, and does not save a history of<br />
|
“air gapped”, meaning it is not connected to any network / internet, and does not save a history of
|
||||||
commands performed on it.</p>
|
commands performed on it.</p>
|
||||||
<p>PGP encrypts data (files, messages, etc.) for one or more recipients, using the recipients public<br />
|
<p>PGP encrypts data (files, messages, etc.) for one or more recipients, using the recipients public
|
||||||
key. The recipients private key is required to decrypt the data once it’s been encrypted.</p>
|
key. The recipients private key is required to decrypt the data once it’s been encrypted.</p>
|
||||||
<p>Your key pair is tied to your identity / person, generally by your name and email(s). The key can<br />
|
<p>Your key pair is tied to your identity / person, generally by your name and email(s). The key can
|
||||||
also have multiple “subkeys”, meaning that if you have more than one public email, alias, etc. it<br />
|
also have multiple “subkeys”, meaning that if you have more than one public email, alias, etc. it
|
||||||
can be tied to your same private key. This is useful for example for work vs. activism vs. software<br />
|
can be tied to your same private key. This is useful for example for work vs. activism vs. software
|
||||||
development.</p>
|
development.</p>
|
||||||
<p>Once your key is generated and your private key secured, you can share your public portion of the<br />
|
<p>Once your key is generated and your private key secured, you can share your public portion of the
|
||||||
key to a “keyserver” where other people can download it and verify messages were sent by you.</p>
|
key to a “keyserver” where other people can download it and verify messages were sent by you.</p>
|
||||||
<h2>Web of Trust</h2>
|
<h2>Web of Trust</h2>
|
||||||
<p>PGP also uses what is called the <strong>“Web of Trust”</strong>, which is used to validate that messages are<br />
|
<p>PGP also uses what is called the <strong>“Web of Trust”</strong>, which is used to validate that messages are
|
||||||
encrypted by a trusted source. There are different levels of trust depending on where a key is<br />
|
encrypted by a trusted source. There are different levels of trust depending on where a key is
|
||||||
retrieved from. For example, if somebody gave you their public key in person and you were able to<br />
|
retrieved from. For example, if somebody gave you their public key in person and you were able to
|
||||||
inspect that the identity matches their government id, then you can give it a higher trust level<br />
|
inspect that the identity matches their government id, then you can give it a higher trust level
|
||||||
than one that is sent / retrieved from a keyserver.</p>
|
than one that is sent / retrieved from a keyserver.</p>
|
||||||
<p>My understanding of this portion is that over time your key is signed by other’s with their level of<br />
|
<p>My understanding of this portion is that over time your key is signed by other’s with their level of
|
||||||
certainty about you / your key, which over time increases the overall trust in your key.</p>
|
certainty about you / your key, which over time increases the overall trust in your key.</p>
|
||||||
<h2>Out of the weeds</h2>
|
<h2>Out of the weeds</h2>
|
||||||
<p>Now that we’ve got an understanding of some of the technical aspects, lets talk about some real use<br />
|
<p>Now that we’ve got an understanding of some of the technical aspects, lets talk about some real use
|
||||||
cases of PGP encryption.</p>
|
cases of PGP encryption.</p>
|
||||||
<p>PGP encryption is used by some email clients / applications, such as<br />
|
<p>PGP encryption is used by some email clients / applications, such as
|
||||||
<a href="https://canarymail.io/">Canary</a>,<br />
|
<a href="https://canarymail.io/">Canary</a>,
|
||||||
<a href="https://www.thunderbird.net/en-US/thunderbird/115.0/holidayeoy/">Thunderbird</a>, or<br />
|
<a href="https://www.thunderbird.net/en-US/thunderbird/115.0/holidayeoy/">Thunderbird</a>, or
|
||||||
<a href="https://gpgtools.tenderapp.com/">GPGSuite</a>.</p>
|
<a href="https://gpgtools.tenderapp.com/">GPGSuite</a>.</p>
|
||||||
<p>In my understanding, it is also what is used in devices such as a<br />
|
<p>In my understanding, it is also what is used in devices such as a
|
||||||
<a href="https://www.yubico.com/">YubiKey</a>.</p>
|
<a href="https://www.yubico.com/">YubiKey</a>.</p>
|
||||||
<p>Many of the mentioned applications allow for an easier interface / adoption, as one of the reasons<br />
|
<p>Many of the mentioned applications allow for an easier interface / adoption, as one of the reasons
|
||||||
it is not very popular is that it can be hard to use PGP for the average person.</p>
|
it is not very popular is that it can be hard to use PGP for the average person.</p>
|
||||||
<p>Aside from using my PGP key for signing software commits, my major use case is for encrypting files<br />
|
<p>Aside from using my PGP key for signing software commits, my major use case is for encrypting files
|
||||||
that I store in a “cloud” provider. Know that when someone says the “cloud”, it is really just a<br />
|
that I store in a “cloud” provider. Know that when someone says the “cloud”, it is really just a
|
||||||
computer (in reality a gang of computers in a data center). You are solely reliant that these cloud<br />
|
computer (in reality a gang of computers in a data center). You are solely reliant that these cloud
|
||||||
providers are not snooping on, inspecting, or even selling your data.</p>
|
providers are not snooping on, inspecting, or even selling your data.</p>
|
||||||
<p>Of course, some data may not be that sensitive, so maybe you don’t care. However with a little bit<br />
|
<p>Of course, some data may not be that sensitive, so maybe you don’t care. However with a little bit
|
||||||
of effort on your part you can at least make it very hard for anyone to know what is inside your<br />
|
of effort on your part you can at least make it very hard for anyone to know what is inside your
|
||||||
documents. You can be in control of the way your items are encrypted and have confidence that nobody<br />
|
documents. You can be in control of the way your items are encrypted and have confidence that nobody
|
||||||
but you can access what is inside your documents.</p>
|
but you can access what is inside your documents.</p>
|
||||||
<p>Heck, I even encrypt documents that are stored on my own network / computer so that if something<br />
|
<p>Heck, I even encrypt documents that are stored on my own network / computer so that if something
|
||||||
get’s stolen or someone breach’s my network they will not be able to easily get to sensitive data.</p>
|
get’s stolen or someone breach’s my network they will not be able to easily get to sensitive data.</p>
|
||||||
<h2>Conclusion</h2>
|
<h2>Conclusion</h2>
|
||||||
<p>This article is just meant as an overview of PGP encryption. In future articles I will show you how<br />
|
<p>This article is just meant as an overview of PGP encryption. In future articles I will show you how
|
||||||
to use it to encrypt your data and be in control of your privacy.</p>
|
to use it to encrypt your data and be in control of your privacy.</p>
|
||||||
<h3>Resources</h3>
|
<h3>Resources</h3>
|
||||||
<ul>
|
<ul>
|
||||||
@@ -171,7 +171,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2025-01-05-vapor-htmx-todo-app.png"/>
|
|
||||||
Build an example application using Vapor and HTMX.
|
Build an example application using Vapor and HTMX.
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -185,7 +184,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2024/free-as-in-freedom/"><div>
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2024-04-09-free-as-in-freedom.png"/>
|
|
||||||
Salute to open-source software engineers
|
Salute to open-source software engineers
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -216,6 +214,12 @@ Programming, Home-Performance, and Building Science
|
|||||||
|
|
|
|
||||||
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
</p>
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -64,19 +64,19 @@ any warranty on your UNVR as we are using it for..." name="og:description"/>
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2024-03-15-unvr-as-nas.png"/>
|
<img alt="banner" src="http://localhost:3000/articles/images/2024-03-15-unvr-as-nas.png"/>
|
||||||
<p>In this post, I’m going to show how to setup a Samba server on a Ubiquity UNVR so that it can be<br />
|
<p>In this post, I’m going to show how to setup a Samba server on a Ubiquity UNVR so that it can be
|
||||||
used as NAS (network attached storage). Be aware that this should be done with caution and may void<br />
|
used as NAS (network attached storage). Be aware that this should be done with caution and may void
|
||||||
any warranty on your UNVR as we are using it for purposes beyond it’s original intent. It’s also<br />
|
any warranty on your UNVR as we are using it for purposes beyond it’s original intent. It’s also
|
||||||
possible that this setup will break when / if updating the UNVR software. With that said, let’s jump<br />
|
possible that this setup will break when / if updating the UNVR software. With that said, let’s jump
|
||||||
in.</p>
|
in.</p>
|
||||||
<p>This post follows along with<br />
|
<p>This post follows along with
|
||||||
<a href="https://www.reddit.com/r/Ubiquiti/comments/11o7v8l/how_to_use_the_unvr_as_a_nas_instructions/">this reddit post</a>,<br />
|
<a href="https://www.reddit.com/r/Ubiquiti/comments/11o7v8l/how_to_use_the_unvr_as_a_nas_instructions/">this reddit post</a>,
|
||||||
with some adaptations to get it to work on the latest Unifi-OS release of <code>3.2.12</code>.</p>
|
with some adaptations to get it to work on the latest Unifi-OS release of <code>3.2.12</code>.</p>
|
||||||
<h2>Step One - Setup SSH & Login</h2>
|
<h2>Step One - Setup SSH & Login</h2>
|
||||||
<p>In your unifi network console you need to enable the <code>SSH</code> login option and set a secure password<br />
|
<p>In your unifi network console you need to enable the <code>SSH</code> login option and set a secure password
|
||||||
for the root user to login to the UNVR.</p>
|
for the root user to login to the UNVR.</p>
|
||||||
<p><img src="/articles/images/2024-03-15-ssh.png" alt="ssh.png" /></p>
|
<p><img src="/articles/images/2024-03-15-ssh.png" alt="ssh.png" /></p>
|
||||||
<p>Once that is complete you can login to your UNVR using your terminal and the IP address of your UNVR<br />
|
<p>Once that is complete you can login to your UNVR using your terminal and the IP address of your UNVR
|
||||||
on your network.</p>
|
on your network.</p>
|
||||||
<p><code>ssh root@192.168.1.10</code></p>
|
<p><code>ssh root@192.168.1.10</code></p>
|
||||||
<h2>Step Two - Install Samba</h2>
|
<h2>Step Two - Install Samba</h2>
|
||||||
@@ -85,14 +85,14 @@ on your network.</p>
|
|||||||
<p>Next, install samba.</p>
|
<p>Next, install samba.</p>
|
||||||
<p><code>apt-get install samba</code></p>
|
<p><code>apt-get install samba</code></p>
|
||||||
<h2>Step Three - Setup Samba</h2>
|
<h2>Step Three - Setup Samba</h2>
|
||||||
<p>In order to edit the configuration we are going to need to install your terminal based text editor<br />
|
<p>In order to edit the configuration we are going to need to install your terminal based text editor
|
||||||
of choice (generally nano or vim), for me I will install vim.</p>
|
of choice (generally nano or vim), for me I will install vim.</p>
|
||||||
<p><code>apt-get install vim</code></p>
|
<p><code>apt-get install vim</code></p>
|
||||||
<p>Create a backup of the default configuration.</p>
|
<p>Create a backup of the default configuration.</p>
|
||||||
<p><code>cp /etc/samba/smb.conf /etc/samba/smb.conf.bak</code></p>
|
<p><code>cp /etc/samba/smb.conf /etc/samba/smb.conf.bak</code></p>
|
||||||
<p>Open the configuration file to be edited.</p>
|
<p>Open the configuration file to be edited.</p>
|
||||||
<p><code>vim /etc/samba/smb.conf</code></p>
|
<p><code>vim /etc/samba/smb.conf</code></p>
|
||||||
<p>Just above the <code>Share Definitions</code> section of the configuration, I added some global settings to<br />
|
<p>Just above the <code>Share Definitions</code> section of the configuration, I added some global settings to
|
||||||
make the samba server act better for time machine backups.</p>
|
make the samba server act better for time machine backups.</p>
|
||||||
<pre><code>#======================= MacOS Client Optimizations =======================
|
<pre><code>#======================= MacOS Client Optimizations =======================
|
||||||
vfs objects = fruit streams_xattr
|
vfs objects = fruit streams_xattr
|
||||||
@@ -105,11 +105,11 @@ fruit:wipe_intentionally_left_blank_rfork = yes
|
|||||||
fruit:delete_empty_adfiles = yes
|
fruit:delete_empty_adfiles = yes
|
||||||
|
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>Also because we want users we create to be able to read and write to their home directories created<br />
|
<p>Also because we want users we create to be able to read and write to their home directories created
|
||||||
on the samba server, we need to change the option under the <code>[homes]</code> share definition to be<br />
|
on the samba server, we need to change the option under the <code>[homes]</code> share definition to be
|
||||||
<code>read only = no</code>.</p>
|
<code>read only = no</code>.</p>
|
||||||
<p>That is our primary configuration. You can add more share definitions at the bottom of the file to<br />
|
<p>That is our primary configuration. You can add more share definitions at the bottom of the file to
|
||||||
suit your use case, there are decent examples of this in the original reddit post, linked in the<br />
|
suit your use case, there are decent examples of this in the original reddit post, linked in the
|
||||||
beginning.</p>
|
beginning.</p>
|
||||||
<p>Save and exit the file.</p>
|
<p>Save and exit the file.</p>
|
||||||
<p><code>:wq</code></p>
|
<p><code>:wq</code></p>
|
||||||
@@ -130,13 +130,13 @@ beginning.</p>
|
|||||||
<p>In the <code>Finder</code> app on macOS you can type <code>⌘k</code> to connect to a server.</p>
|
<p>In the <code>Finder</code> app on macOS you can type <code>⌘k</code> to connect to a server.</p>
|
||||||
<p>In the text field enter <code>smb://<USER>@<UNVR_IP></code> to connect to the samba server.</p>
|
<p>In the text field enter <code>smb://<USER>@<UNVR_IP></code> to connect to the samba server.</p>
|
||||||
<p><img src="/articles/images/2024-03-15-connect.png" alt="connect" /></p>
|
<p><img src="/articles/images/2024-03-15-connect.png" alt="connect" /></p>
|
||||||
<p>You can also automatically connect to the server when you login to your client device, for this to<br />
|
<p>You can also automatically connect to the server when you login to your client device, for this to
|
||||||
work you need the credentials to be stored in your keychain (ticking the box in the step above when<br />
|
work you need the credentials to be stored in your keychain (ticking the box in the step above when
|
||||||
you first connect to the server).</p>
|
you first connect to the server).</p>
|
||||||
<p>This is found in <code>System Settings -> General -> Login Items -> Open at Login</code>. Click the plus button<br />
|
<p>This is found in <code>System Settings -> General -> Login Items -> Open at Login</code>. Click the plus button
|
||||||
and select the volume you would like to mount at login.</p>
|
and select the volume you would like to mount at login.</p>
|
||||||
<p><img src="/articles/images/2024-03-15-login.png" alt="login" /></p>
|
<p><img src="/articles/images/2024-03-15-login.png" alt="login" /></p>
|
||||||
<p>Once you have it setup so that the server is connected on login, you can also set it up as location<br />
|
<p>Once you have it setup so that the server is connected on login, you can also set it up as location
|
||||||
for Time Machine Backups. <code>System Settings -> General -> Time Machine</code></p>
|
for Time Machine Backups. <code>System Settings -> General -> Time Machine</code></p>
|
||||||
<p><img src="/articles/images/2024-03-15-time-machine.png" alt="time-machine" /></p>
|
<p><img src="/articles/images/2024-03-15-time-machine.png" alt="time-machine" /></p>
|
||||||
</article>
|
</article>
|
||||||
@@ -173,7 +173,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
<a href="/articles/2025/vapor-htmx-todo-app/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2025-01-05-vapor-htmx-todo-app.png"/>
|
|
||||||
Build an example application using Vapor and HTMX.
|
Build an example application using Vapor and HTMX.
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -187,7 +186,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2024/free-as-in-freedom/"><div>
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2024-04-09-free-as-in-freedom.png"/>
|
|
||||||
Salute to open-source software engineers
|
Salute to open-source software engineers
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -218,6 +216,12 @@ Programming, Home-Performance, and Building Science
|
|||||||
|
|
|
|
||||||
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
</p>
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -69,6 +69,12 @@
|
|||||||
|
|
|
|
||||||
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
</p>
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -61,8 +61,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2025-01-05-vapor-htmx-todo-app.png"/>
|
<img alt="banner" src="http://localhost:3000/articles/images/2025-01-05-vapor-htmx-todo-app.png"/>
|
||||||
<h2>Introduction</h2>
|
<h2>Introduction</h2>
|
||||||
<p>This post is a quick example of creating a very basic todo web application using <code>Vapor</code> a swift web<br />
|
<p>This post is a quick example of creating a very basic todo web application using <code>Vapor</code> a swift web framework and <code>Htmx</code>, with no custom
|
||||||
framework and <code>Htmx</code>, with no custom javascript required.</p>
|
javascript required.</p>
|
||||||
<p><a href="https://docs.vapor.codes">Vapor</a></p>
|
<p><a href="https://docs.vapor.codes">Vapor</a></p>
|
||||||
<p><a href="https://htmx.org">Htmx</a></p>
|
<p><a href="https://htmx.org">Htmx</a></p>
|
||||||
<h2>Getting Started</h2>
|
<h2>Getting Started</h2>
|
||||||
@@ -73,23 +73,21 @@ framework and <code>Htmx</code>, with no custom javascript required.</p>
|
|||||||
<p><img src="/articles/images/2025-01-05-vapor.gif" alt="" /></p>
|
<p><img src="/articles/images/2025-01-05-vapor.gif" alt="" /></p>
|
||||||
<pre><code class="language-bash">vapor new todo-htmx --fluent.db sqlite --leaf
|
<pre><code class="language-bash">vapor new todo-htmx --fluent.db sqlite --leaf
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>The above command will generate a new project that uses an <code>SQLite</code> database along with vapor’s<br />
|
<p>The above command will generate a new project that uses an <code>SQLite</code> database along with vapor’s <code>Leaf</code> templating engine. You can move into
|
||||||
<code>Leaf</code> templating engine. You can move into the project directory and browse around the files that<br />
|
the project directory and browse around the files that are generated.</p>
|
||||||
are generated.</p>
|
|
||||||
<pre><code class="language-bash">cd todo-htmx
|
<pre><code class="language-bash">cd todo-htmx
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<h2>Update the Controller</h2>
|
<h2>Update the Controller</h2>
|
||||||
<p>Open the <code>Sources/App/Controllers/TodoController.swift</code> file. This file handles the api routes for<br />
|
<p>Open the <code>Sources/App/Controllers/TodoController.swift</code> file. This file handles the api routes for our <code>Todo</code> database model. Personally I
|
||||||
our <code>Todo</code> database model. Personally I like to prefix these routes with <code>api</code>.</p>
|
like to prefix these routes with <code>api</code>.</p>
|
||||||
<p>Update the first line in the <code>boot(routes: RoutesBuilder)</code> function to look like this.</p>
|
<p>Update the first line in the <code>boot(routes: RoutesBuilder)</code> function to look like this.</p>
|
||||||
<pre><code class="language-swift">let todos = routes.grouped("api", "todos")
|
<pre><code class="language-swift">let todos = routes.grouped("api", "todos")
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>Everything else can stay the same. This changes these routes to be exposed at<br />
|
<p>Everything else can stay the same. This changes these routes to be exposed at <code>http://localhost:8080/api/todos</code>, which will allow our routes
|
||||||
<code>http://localhost:8080/api/todos</code>, which will allow our routes that return html views to be able to<br />
|
that return html views to be able to be exposed at <code>http://localhost:8080/todos</code>.</p>
|
||||||
be exposed at <code>http://localhost:8080/todos</code>.</p>
|
|
||||||
<h2>Update the Todo Model</h2>
|
<h2>Update the Todo Model</h2>
|
||||||
<p>A todo is not very valuable without a way to tell if it needs to be completed or not. So, let’s add<br />
|
<p>A todo is not very valuable without a way to tell if it needs to be completed or not. So, let’s add a field to our database model
|
||||||
a field to our database model (<code>Sources/App/Models/Todo.swift</code>).</p>
|
(<code>Sources/App/Models/Todo.swift</code>).</p>
|
||||||
<p>Update the file to include the following:</p>
|
<p>Update the file to include the following:</p>
|
||||||
<pre><code class="language-swift">import Fluent
|
<pre><code class="language-swift">import Fluent
|
||||||
import struct Foundation.UUID
|
import struct Foundation.UUID
|
||||||
@@ -126,8 +124,7 @@ final class Todo: Model, @unchecked Sendable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>Since we added a field to our database model, we also need to update the migration file<br />
|
<p>Since we added a field to our database model, we also need to update the migration file (<code>Sources/App/Migrations/CreateTodo.swift</code>).</p>
|
||||||
(<code>Sources/App/Migrations/CreateTodo.swift</code>).</p>
|
|
||||||
<pre><code class="language-swift">import Fluent
|
<pre><code class="language-swift">import Fluent
|
||||||
|
|
||||||
struct CreateTodo: AsyncMigration {
|
struct CreateTodo: AsyncMigration {
|
||||||
@@ -144,11 +141,10 @@ struct CreateTodo: AsyncMigration {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>This just adds our new field to the database schema when we run the migrations, which we will do<br />
|
<p>This just adds our new field to the database schema when we run the migrations, which we will do later on in the tutorial.</p>
|
||||||
later on in the tutorial.</p>
|
|
||||||
<h3>Update the Data Transfer Object</h3>
|
<h3>Update the Data Transfer Object</h3>
|
||||||
<p>We also need to add the <code>complete</code> field to our data transfer object (<code>DTO</code>). This model is used as<br />
|
<p>We also need to add the <code>complete</code> field to our data transfer object (<code>DTO</code>). This model is used as an intermediate between our database and
|
||||||
an intermediate between our database and the user.</p>
|
the user.</p>
|
||||||
<pre><code class="language-swift">import Fluent
|
<pre><code class="language-swift">import Fluent
|
||||||
import Vapor
|
import Vapor
|
||||||
|
|
||||||
@@ -170,11 +166,9 @@ struct TodoDTO: Content {
|
|||||||
}
|
}
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<h2>Generate the View Templates</h2>
|
<h2>Generate the View Templates</h2>
|
||||||
<p>Our index template was already generated at <code>Resources/Views/index.leaf</code>, open the file and edit the<br />
|
<p>Our index template was already generated at <code>Resources/Views/index.leaf</code>, open the file and edit the contents to match the following.</p>
|
||||||
contents to match the following.</p>
|
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>Note: You can learn more about the<br />
|
<p>Note: You can learn more about the <a href="https://docs.vapor.codes/leaf/getting-started/">leaf templating engine here.</a></p>
|
||||||
<a href="https://docs.vapor.codes/leaf/getting-started/">leaf templating engine here.</a></p>
|
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<pre><code class="language-html"><!doctype html>
|
<pre><code class="language-html"><!doctype html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
@@ -200,15 +194,12 @@ contents to match the following.</p>
|
|||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>The important parts here are the <code><script></code> tag in the head element which will include <code>Htmx</code> in our<br />
|
<p>The important parts here are the <code><script></code> tag in the head element which will include <code>Htmx</code> in our project.</p>
|
||||||
project.</p>
|
|
||||||
<p>The head element also contains a link to a custom <code>css</code> stylesheet that we will create shortly.</p>
|
<p>The head element also contains a link to a custom <code>css</code> stylesheet that we will create shortly.</p>
|
||||||
<p>We add a <code>form</code> element that will be used to generate a new todo item in the database. This is a<br />
|
<p>We add a <code>form</code> element that will be used to generate a new todo item in the database. This is a basic / standard html form, but we are
|
||||||
basic / standard html form, but we are using <code>Htmx</code> to post the form contents to the route<br />
|
using <code>Htmx</code> to post the form contents to the route <code>POST http://localhost:8080/todos</code>, which we will create shortly.</p>
|
||||||
<code>POST http://localhost:8080/todos</code>, which we will create shortly.</p>
|
<p>Then there’s the <code>table</code> element that will contain the contents of our todos. When the page is loaded it will use <code>Htmx</code> to fetch the todos
|
||||||
<p>Then there’s the <code>table</code> element that will contain the contents of our todos. When the page is<br />
|
from <code>GET http://localhost:8080/todos</code> route, which we will create shortly.</p>
|
||||||
loaded it will use <code>Htmx</code> to fetch the todos from <code>GET http://localhost:8080/todos</code> route, which we<br />
|
|
||||||
will create shortly.</p>
|
|
||||||
<h3>Todos Table Template</h3>
|
<h3>Todos Table Template</h3>
|
||||||
<p>Create a new view template that will return our populated table of todos.</p>
|
<p>Create a new view template that will return our populated table of todos.</p>
|
||||||
<pre><code class="language-bash">touch Resources/Views/todos.leaf
|
<pre><code class="language-bash">touch Resources/Views/todos.leaf
|
||||||
@@ -249,14 +240,12 @@ will create shortly.</p>
|
|||||||
#endfor
|
#endfor
|
||||||
</table>
|
</table>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>Here, we just create a table that is 3 columns wide from a list of todos that we will pass in to the<br />
|
<p>Here, we just create a table that is 3 columns wide from a list of todos that we will pass in to the template. We use <code>Htmx</code> to handle
|
||||||
template. We use <code>Htmx</code> to handle updating a todo if a user clicks a checkbox to mark the todo as<br />
|
updating a todo if a user clicks a checkbox to mark the todo as <code>complete</code>, we also add a button in the last column of the table that we use
|
||||||
<code>complete</code>, we also add a button in the last column of the table that we use <code>Htmx</code> to handle<br />
|
<code>Htmx</code> to handle deleting a todo from the database.</p>
|
||||||
deleting a todo from the database.</p>
|
|
||||||
<h2>Controllers</h2>
|
<h2>Controllers</h2>
|
||||||
<p>The controllers handle the routes that our website exposes. The project template creates a<br />
|
<p>The controllers handle the routes that our website exposes. The project template creates a controller for us that handles <code>JSON</code> / <code>API</code>
|
||||||
controller for us that handles <code>JSON</code> / <code>API</code> requests, but we do need to make a couple of changes<br />
|
requests, but we do need to make a couple of changes to the file (<code>Sources/App/Controllers/TodoController.swift</code>).</p>
|
||||||
to the file (<code>Sources/App/Controllers/TodoController.swift</code>).</p>
|
|
||||||
<pre><code class="language-swift">import Fluent
|
<pre><code class="language-swift">import Fluent
|
||||||
import Vapor
|
import Vapor
|
||||||
|
|
||||||
@@ -308,16 +297,13 @@ struct TodoController: RouteCollection {
|
|||||||
|
|
||||||
}
|
}
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>The primary changes here are to add the <code>update(req: Request)</code> function at the bottom, which handles<br />
|
<p>The primary changes here are to add the <code>update(req: Request)</code> function at the bottom, which handles updating a todo that has already been
|
||||||
updating a todo that has already been created. This will be used when a user clicks on the checkbox<br />
|
created. This will be used when a user clicks on the checkbox to mark a todo as complete or incomplete.</p>
|
||||||
to mark a todo as complete or incomplete.</p>
|
<p>We also change the route in the <code>boot(routes: RoutesBuilder)</code> method to make all these routes accessible at <code>/api/todos</code> instead of the
|
||||||
<p>We also change the route in the <code>boot(routes: RoutesBuilder)</code> method to make all these routes<br />
|
original <code>/todos</code> as we will use the <code>/todos</code> routes for returning our views from our view controller.</p>
|
||||||
accessible at <code>/api/todos</code> instead of the original <code>/todos</code> as we will use the <code>/todos</code> routes for<br />
|
|
||||||
returning our views from our view controller.</p>
|
|
||||||
<h3>Todo View Controller</h3>
|
<h3>Todo View Controller</h3>
|
||||||
<p>Next we need to create our view controller, it is what will be used to handle routes that should<br />
|
<p>Next we need to create our view controller, it is what will be used to handle routes that should return <code>html</code> content for our website. This
|
||||||
return <code>html</code> content for our website. This controller will actually use the api controller to do<br />
|
controller will actually use the api controller to do the majority of it’s work.</p>
|
||||||
the majority of it’s work.</p>
|
|
||||||
<p>The easiest thing is to make a copy of the current api controller:</p>
|
<p>The easiest thing is to make a copy of the current api controller:</p>
|
||||||
<pre><code class="language-bash">cp Sources/App/Controllers/TodoController.swift Sources/App/Controllers/TodoViewController.swift
|
<pre><code class="language-bash">cp Sources/App/Controllers/TodoController.swift Sources/App/Controllers/TodoViewController.swift
|
||||||
</code></pre>
|
</code></pre>
|
||||||
@@ -365,9 +351,8 @@ struct TodoViewController: RouteCollection {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>Here we use the api controller to do the heavy lifting of communicating with the database, then we<br />
|
<p>Here we use the api controller to do the heavy lifting of communicating with the database, then we just always return / render the
|
||||||
just always return / render the <code>todos.leaf</code> template that we created earlier, which will update our<br />
|
<code>todos.leaf</code> template that we created earlier, which will update our web page with the list of todos retreived from the database.</p>
|
||||||
web page with the list of todos retreived from the database.</p>
|
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>Note: There are better ways to handle this, however this is just a simple example.</p>
|
<p>Note: There are better ways to handle this, however this is just a simple example.</p>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
@@ -389,29 +374,29 @@ func routes(_ app: Application) throws {
|
|||||||
try app.register(collection: TodoViewController())
|
try app.register(collection: TodoViewController())
|
||||||
}
|
}
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>Here, we just add the <code>TodoViewController</code> at the bottom so vapor will be able to handle those<br />
|
<p>Here, we just add the <code>TodoViewController</code> at the bottom so vapor will be able to handle those routes and also update the title to be
|
||||||
routes and also update the title to be <code>Todos</code> (in the first <code>app.get</code> near the top).</p>
|
<code>Todos</code> (in the first <code>app.get</code> near the top).</p>
|
||||||
<h2>Build and Run</h2>
|
<h2>Build and Run</h2>
|
||||||
<p>At this point we should be able to build and run the application.</p>
|
<p>At this point we should be able to build and run the application.</p>
|
||||||
<p>First, let’s make sure the project builds.</p>
|
<p>First, let’s make sure the project builds.</p>
|
||||||
<pre><code class="language-bash">swift build
|
<pre><code class="language-bash">swift build
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>This may take a minute if it’s the first time building the project as it has to fetch the<br />
|
<p>This may take a minute if it’s the first time building the project as it has to fetch the dependencies. If you experience problems here then
|
||||||
dependencies. If you experience problems here then make sure you don’t have typos in your files.</p>
|
make sure you don’t have typos in your files.</p>
|
||||||
<p>Next, we need to run the database migrations.</p>
|
<p>Next, we need to run the database migrations.</p>
|
||||||
<pre><code class="language-bash">swift run App migrate
|
<pre><code class="language-bash">swift run App migrate
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>Finally, we can run the application.</p>
|
<p>Finally, we can run the application.</p>
|
||||||
<pre><code class="language-bash">swift run App
|
<pre><code class="language-bash">swift run App
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>You should be able to open your browser and type in the url: <code>http://localhost:8080</code> to view the<br />
|
<p>You should be able to open your browser and type in the url: <code>http://localhost:8080</code> to view the application. You can experiment with adding
|
||||||
application. You can experiment with adding a new todo using the form.</p>
|
a new todo using the form.</p>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>Note: To stop the application use <code>Ctrl-c</code></p>
|
<p>Note: To stop the application use <code>Ctrl-c</code></p>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<h2>Bonus Styles</h2>
|
<h2>Bonus Styles</h2>
|
||||||
<p>Hopefully you weren’t blinded the first time you opened the application. You can add custom styles<br />
|
<p>Hopefully you weren’t blinded the first time you opened the application. You can add custom styles by creating a <code>css</code> file
|
||||||
by creating a <code>css</code> file (<code>Public/css/main.css</code>).</p>
|
(<code>Public/css/main.css</code>).</p>
|
||||||
<pre><code class="language-bash">mkdir Public/css
|
<pre><code class="language-bash">mkdir Public/css
|
||||||
touch Public/css/main.css
|
touch Public/css/main.css
|
||||||
</code></pre>
|
</code></pre>
|
||||||
@@ -444,8 +429,8 @@ td {
|
|||||||
margin-left: 20px;
|
margin-left: 20px;
|
||||||
}
|
}
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<p>Currently vapor does not know to serve files from the <code>Public</code> directory, so we need to update the<br />
|
<p>Currently vapor does not know to serve files from the <code>Public</code> directory, so we need to update the <code>Sources/App/configure.swift</code> file, by
|
||||||
<code>Sources/App/configure.swift</code> file, by uncommenting the line near the top.</p>
|
uncommenting the line near the top.</p>
|
||||||
<pre><code class="language-swift">import Fluent
|
<pre><code class="language-swift">import Fluent
|
||||||
import FluentSQLiteDriver
|
import FluentSQLiteDriver
|
||||||
import Leaf
|
import Leaf
|
||||||
@@ -471,7 +456,7 @@ public func configure(_ app: Application) async throws {
|
|||||||
<pre><code class="language-bash">swift run App
|
<pre><code class="language-bash">swift run App
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<h2>Conclusion</h2>
|
<h2>Conclusion</h2>
|
||||||
<p>I hope you enjoyed this quick example of using <code>Htmx</code> with <code>Vapor</code>. You can view the source files at<br />
|
<p>I hope you enjoyed this quick example of using <code>Htmx</code> with <code>Vapor</code>. You can view the source files at
|
||||||
<a href="https://github.com/m-housh/todo-htmx">here</a>.</p>
|
<a href="https://github.com/m-housh/todo-htmx">here</a>.</p>
|
||||||
</article>
|
</article>
|
||||||
<div class="border-t border-light mt-8 pt-8">
|
<div class="border-t border-light mt-8 pt-8">
|
||||||
@@ -507,7 +492,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2024/free-as-in-freedom/"><div>
|
<a href="/articles/2024/free-as-in-freedom/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2024-04-09-free-as-in-freedom.png"/>
|
|
||||||
Salute to open-source software engineers
|
Salute to open-source software engineers
|
||||||
</div></a>
|
</div></a>
|
||||||
</p>
|
</p>
|
||||||
@@ -521,7 +505,6 @@ Programming, Home-Performance, and Building Science
|
|||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="/articles/2024/pgp-encryption-introduction/"><div>
|
<a href="/articles/2024/pgp-encryption-introduction/"><div>
|
||||||
<img alt="banner" src="http://localhost:3000/articles/images/2024-04-04-pgp-encryption-introduction.gif"/>
|
|
||||||
In this article I introduce PGP and show a use case for me, which perhaps you can use as well.
|
In this article I introduce PGP and show a use case for me, which perhaps you can use as well.
|
||||||
What is PGP
|
What is PGP
|
||||||
PGP stands for Pretty Good Privacy, it was first developed in 1991 by Phil Zimmermann. PGP uses
|
PGP stands for Pretty Good Privacy, it was first developed in 1991 by Phil Zimmermann. PGP uses
|
||||||
@@ -555,6 +538,12 @@ cryptographic privacy and authentication and is...
|
|||||||
|
|
|
|
||||||
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
<a href="mailto:michael@mhoush.com" rel="nofollow">Email</a>
|
||||||
</p>
|
</p>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/keep-markup/prism-keep-markup.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js">
|
||||||
|
</script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
File diff suppressed because it is too large
Load Diff
BIN
deploy/articles/images/2023-08-10-coil-bypass-overview.png
LFS
Normal file
BIN
deploy/articles/images/2023-08-10-coil-bypass-overview.png
LFS
Normal file
Binary file not shown.
BIN
deploy/articles/images/2023-08-10-register-throw.png
LFS
Normal file
BIN
deploy/articles/images/2023-08-10-register-throw.png
LFS
Normal file
Binary file not shown.
BIN
deploy/articles/images/2023-08-10-rss-feed.gif
LFS
Normal file
BIN
deploy/articles/images/2023-08-10-rss-feed.gif
LFS
Normal file
Binary file not shown.
BIN
deploy/articles/images/2023-08-10-volume-equation.png
LFS
Normal file
BIN
deploy/articles/images/2023-08-10-volume-equation.png
LFS
Normal file
Binary file not shown.
BIN
deploy/articles/images/2023-09-08-formula.png
LFS
Normal file
BIN
deploy/articles/images/2023-09-08-formula.png
LFS
Normal file
Binary file not shown.
BIN
deploy/articles/images/2023-09-08-pounds-of-water-removed.png
LFS
Normal file
BIN
deploy/articles/images/2023-09-08-pounds-of-water-removed.png
LFS
Normal file
Binary file not shown.
BIN
deploy/articles/images/2023-09-08-solution.png
LFS
Normal file
BIN
deploy/articles/images/2023-09-08-solution.png
LFS
Normal file
Binary file not shown.
BIN
deploy/articles/images/2023-09-14-why-mini-splits-stink.png
LFS
Normal file
BIN
deploy/articles/images/2023-09-14-why-mini-splits-stink.png
LFS
Normal file
Binary file not shown.
BIN
deploy/articles/images/2023-09-15-pints-per-day-example.png
LFS
Normal file
BIN
deploy/articles/images/2023-09-15-pints-per-day-example.png
LFS
Normal file
Binary file not shown.
BIN
deploy/articles/images/2023-09-15-pints-per-day-example2.png
LFS
Normal file
BIN
deploy/articles/images/2023-09-15-pints-per-day-example2.png
LFS
Normal file
Binary file not shown.
BIN
deploy/articles/images/2023-09-15-pints-per-day.png
LFS
Normal file
BIN
deploy/articles/images/2023-09-15-pints-per-day.png
LFS
Normal file
Binary file not shown.
BIN
deploy/articles/images/2023-09-15-sizing-dehumidifier-by-latent-load.png
LFS
Normal file
BIN
deploy/articles/images/2023-09-15-sizing-dehumidifier-by-latent-load.png
LFS
Normal file
Binary file not shown.
BIN
deploy/articles/images/2023-09-18-dh-size.png
LFS
Normal file
BIN
deploy/articles/images/2023-09-18-dh-size.png
LFS
Normal file
Binary file not shown.
BIN
deploy/articles/images/2023-09-18-help.png
LFS
Normal file
BIN
deploy/articles/images/2023-09-18-help.png
LFS
Normal file
Binary file not shown.
BIN
deploy/articles/images/2023-09-18-introducing-psychrometrics-cli.png
LFS
Normal file
BIN
deploy/articles/images/2023-09-18-introducing-psychrometrics-cli.png
LFS
Normal file
Binary file not shown.
BIN
deploy/articles/images/2023-09-18-pounds-removed.png
LFS
Normal file
BIN
deploy/articles/images/2023-09-18-pounds-removed.png
LFS
Normal file
Binary file not shown.
BIN
deploy/articles/images/2023-09-18-properties.png
LFS
Normal file
BIN
deploy/articles/images/2023-09-18-properties.png
LFS
Normal file
Binary file not shown.
Binary file not shown.
BIN
deploy/articles/images/2023-09-21-introduction-to-programming-for-hvac-1.png
LFS
Normal file
BIN
deploy/articles/images/2023-09-21-introduction-to-programming-for-hvac-1.png
LFS
Normal file
Binary file not shown.
BIN
deploy/articles/images/2023-09-21-spotlight.png
LFS
Normal file
BIN
deploy/articles/images/2023-09-21-spotlight.png
LFS
Normal file
Binary file not shown.
BIN
deploy/articles/images/2023-09-21-terminal-line.png
LFS
Normal file
BIN
deploy/articles/images/2023-09-21-terminal-line.png
LFS
Normal file
Binary file not shown.
BIN
deploy/articles/images/2023-09-21-terminal.png
LFS
Normal file
BIN
deploy/articles/images/2023-09-21-terminal.png
LFS
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user