From 90590ef120ca38e5d119563758f8bb57430071e4 Mon Sep 17 00:00:00 2001 From: Correl Roush Date: Fri, 23 Aug 2024 01:32:48 -0400 Subject: [PATCH] notes --- .envrc | 22 ++ 20240709212004-tonberry_humidifier.org | 21 ++ 20240721133048-pto.org | 210 ++++++++++++++++++ 20240811193938-sailmaker_ldap.org | 14 ++ 20240822235459-sailmaker_network_services.org | 36 +++ pto-aweber-2024-discrepency.png | Bin 0 -> 37689 bytes pyproject.toml | 20 ++ 7 files changed, 323 insertions(+) create mode 100644 .envrc create mode 100644 20240709212004-tonberry_humidifier.org create mode 100644 20240721133048-pto.org create mode 100644 20240811193938-sailmaker_ldap.org create mode 100644 20240822235459-sailmaker_network_services.org create mode 100644 pto-aweber-2024-discrepency.png create mode 100644 pyproject.toml diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..fece05e --- /dev/null +++ b/.envrc @@ -0,0 +1,22 @@ +if test -e env/bin/activate +then + . ./env/bin/activate +fi + +if test -f pyproject.toml; then + backend=$(sed -nr 's/^build-backend *= *\"([a-z]+).*/\1/p' pyproject.toml) + case $backend in + poetry|pdm|hatchling) + backend_command=${backend%ling} + if ! command -v $backend_command >/dev/null 2>&1; then + echo WARNING: $backend_command is not installed, the Python environment will not be loaded >/dev/stderr + else + while IFS= read -r -d $'\0' pair; do + export "$pair" + done < <($backend_command run env -0) + fi + ;; + ,*) + echo "WARNING: Unsupported build backend '$backend', the Python environment will not be loaded" >/dev/stderr + esac +fi diff --git a/20240709212004-tonberry_humidifier.org b/20240709212004-tonberry_humidifier.org new file mode 100644 index 0000000..ecaf761 --- /dev/null +++ b/20240709212004-tonberry_humidifier.org @@ -0,0 +1,21 @@ +:PROPERTIES: +:ID: 2e1170d1-a6a4-44ca-abe9-47ffe687960f +:END: +#+title: Tonberry Humidifier + +Project to build a humidifier in the form of a Final Fantasy Tonberry. +* Salvaged parts +** USB Humidifier +*** Energy requirements +- Input :: DC 5V, 300mA USB +- Idle :: 35mA (50mA) +- With humidifier :: 160mA (200mA) + +The board includes three RGB LEDs that I don't have a plan to use, so that +reduces the total power requirements. +** Bluetooth speaker +* Power +| | Voltage | Current | +|------------+---------+---------| +| ESP-8266 | 5 | 100 | +| Humidifier | 5 | 300 | diff --git a/20240721133048-pto.org b/20240721133048-pto.org new file mode 100644 index 0000000..5b59536 --- /dev/null +++ b/20240721133048-pto.org @@ -0,0 +1,210 @@ +:PROPERTIES: +:ID: c21a443b-2311-497b-afcb-52cf866230d2 +:END: +#+title: PTO + +* AWeber +** PTO Accrual +#+caption: Employee Handbook v6 +#+begin_quote +Effective on your anniversary date, and each year thereafter, you earn PTO based +on your years of service per the timeline below: +#+end_quote + +| Years of Service | Yearly Vacation Accrual | Per Pay Period Accrual | +|-------------------+-------------------------+---------------------------------------------------| +| Less than 3 year | 15 days | 0.5775 x hours worked (max at 4.62 hrs per pay) | +| 3 but less than 5 | 20 days | 0.76875 x hours worked (max at 6.15 hrs per pay) | +| 5 but less than 7 | 25 days | 0.96125 x hours worked (max at 7.69 hrs per pay) | +| 7 or more | 30 days | 0.115385 x hours worked (max at 9.23 hrs per day) | + +- Hire Date :: October 23, 2017 +- Initial End Date :: July 22, 2022 +- Rehire Date :: August 28th, 2023 +- Adjusted Seniority Date :: December 1, 2018 + +#+begin_src python :exports none + import datetime + + hired = datetime.date(2017, 10, 23) + left = datetime.date(2022, 7, 22) + rehired = datetime.date(2023, 8, 18) + adjusted_start = datetime.date(2018, 12, 1) + today = datetime.date(2024, 7, 21) + + return [ + ["Actual days employed", ((left - hired) + (today - rehired)).days], + ["Adjusted days employed", (today - adjusted_start).days], + ] +#+end_src + +#+RESULTS: +| Actual days employed | 2071 | +| Adjusted days employed | 2059 | + +** Full History + +#+name: paylocity-pto-history +| Trans Date | Begin Date | Type | Trans Type | Subtype | Hours/Days | Avail Hours/Days | +|------------+------------+------+-------------------+-----------------------+--------------+------------------| +| 07/12/2024 | 07/12/2024 | PTO | Earned | Ongoing | 4.62 Hours | 7.85 Hours | +| 07/12/2024 | 07/12/2024 | PTO | Used | | 8.00 Hours | 3.23 Hours | +| 06/28/2024 | 06/28/2024 | PTO | Earned | Ongoing | 4.62 Hours | 11.23 Hours | +| 06/14/2024 | 06/14/2024 | PTO | Earned | Ongoing | 4.62 Hours | 6.62 Hours | +| 05/31/2024 | 05/31/2024 | PTO | Earned | Ongoing | 4.62 Hours | 2.00 Hours | +| 05/31/2024 | 05/31/2024 | PTO | Used | | 8.00 Hours | -2.61 Hours | +| 05/17/2024 | 05/17/2024 | PTO | Earned | Ongoing | 4.62 Hours | 5.39 Hours | +| 05/03/2024 | 05/03/2024 | PTO | Earned | Ongoing | 4.62 Hours | 0.77 Hours | +| 05/03/2024 | 05/03/2024 | PTO | Used | | 8.00 Hours | -3.85 Hours | +| 04/19/2024 | 04/19/2024 | PTO | Earned | Ongoing | 4.62 Hours | 4.15 Hours | +| 04/05/2024 | 04/05/2024 | PTO | Earned | Ongoing | 4.62 Hours | -0.46 Hours | +| 03/22/2024 | 03/22/2024 | PTO | Earned | Ongoing | 4.62 Hours | -5.08 Hours | +| 03/08/2024 | 03/08/2024 | PTO | Earned | Ongoing | 4.62 Hours | -9.69 Hours | +| 02/23/2024 | 02/23/2024 | PTO | Earned | Ongoing | 4.62 Hours | -14.31 Hours | +| 02/23/2024 | 02/23/2024 | PTO | Used | | 8.00 Hours | -18.92 Hours | +| 02/09/2024 | 02/09/2024 | PTO | Earned | Ongoing | 4.62 Hours | -10.92 Hours | +| 01/26/2024 | 01/26/2024 | PTO | Earned | Ongoing | 4.62 Hours | -15.54 Hours | +| 01/26/2024 | 01/26/2024 | PTO | Used | | 16.00 Hours | -20.15 Hours | +| 01/12/2024 | 01/12/2024 | PTO | Earned | Ongoing | 4.62 Hours | -4.15 Hours | +| 01/12/2024 | 01/12/2024 | VOL | Earned | Ongoing | 0.00 Hours | 16.00 Hours | +| 01/12/2024 | 01/12/2024 | FLEX | Earned | Ongoing | 0.00 Hours | 8.00 Hours | +| 12/29/2023 | 12/29/2023 | PTO | Earned | Ongoing | 4.62 Hours | -8.77 Hours | +| 12/15/2023 | 12/15/2023 | PTO | Earned | Ongoing | 4.62 Hours | -13.38 Hours | +| 12/01/2023 | 12/01/2023 | PTO | Earned | Ongoing | 4.62 Hours | -18.00 Hours | +| 11/17/2023 | 11/17/2023 | PTO | Earned | Ongoing | 4.62 Hours | -22.62 Hours | +| 11/03/2023 | 11/03/2023 | PTO | Earned | Ongoing | 4.62 Hours | -27.23 Hours | +| 11/03/2023 | 11/03/2023 | PTO | Used | | 8.00 Hours | -31.85 Hours | +| 10/20/2023 | 10/20/2023 | PTO | Earned | Ongoing | 4.62 Hours | -23.85 Hours | +| 10/06/2023 | 10/06/2023 | PTO | Earned | Ongoing | 4.62 Hours | -28.46 Hours | +| 10/06/2023 | 10/06/2023 | FLEX | Earned | Above maximum balance | -8.00 Hours | 8.00 Hours | +| 10/06/2023 | 10/06/2023 | FLEX | Initial | | 8.00 Hours | 16.00 Hours | +| 10/06/2023 | 10/06/2023 | PTO | Used | | 16.00 Hours | -33.08 Hours | +| 09/22/2023 | 09/22/2023 | PTO | Earned | Ongoing | 4.62 Hours | -17.08 Hours | +| 09/22/2023 | 09/22/2023 | PTO | Used | | 24.00 Hours | -21.69 Hours | +| 09/08/2023 | 09/08/2023 | PTO | Earned | Ongoing | 2.31 Hours | 2.31 Hours | +| 09/08/2023 | 09/08/2023 | VOL | Earned | Above maximum balance | -16.00 Hours | 16.00 Hours | +| 09/08/2023 | 09/08/2023 | VOL | Initial | | 16.00 Hours | 32.00 Hours | +| 08/29/2023 | 08/29/2023 | PTO | Manual Adjustment | Adjustment | 142.15 Hours | 0.00 Hours | +| 07/29/2022 | 07/29/2022 | PTO | Earned | Ongoing | 6.15 Hours | 6.16 Hours | +| 07/29/2022 | 07/09/2022 | PTO | Used | | 38.15 Hours | 0.00 Hours | +| 07/15/2022 | 07/15/2022 | PTO | Earned | Ongoing | 6.15 Hours | 38.15 Hours | +| 07/01/2022 | 07/01/2022 | PTO | Earned | Ongoing | 6.15 Hours | 32.00 Hours | +| 07/01/2022 | 07/01/2022 | PTO | Used | | 16.00 Hours | 25.85 Hours | +| 06/17/2022 | 06/17/2022 | PTO | Earned | Ongoing | 6.15 Hours | 41.85 Hours | +| 06/03/2022 | 06/03/2022 | PTO | Earned | Ongoing | 6.15 Hours | 35.69 Hours | +| 05/20/2022 | 05/20/2022 | PTO | Earned | Ongoing | 6.15 Hours | 29.54 Hours | +| 05/20/2022 | 05/20/2022 | PTO | Used | | 16.00 Hours | 23.38 Hours | +| 05/06/2022 | 05/06/2022 | PTO | Earned | Ongoing | 6.15 Hours | 39.38 Hours | +| 05/06/2022 | 05/06/2022 | PTO | Used | | 40.00 Hours | 33.23 Hours | +| 04/22/2022 | 04/22/2022 | PTO | Earned | Ongoing | 6.15 Hours | 73.23 Hours | +| 04/08/2022 | 04/08/2022 | PTO | Earned | Ongoing | 6.15 Hours | 67.08 Hours | +| 03/25/2022 | 03/25/2022 | PTO | Earned | Ongoing | 6.15 Hours | 60.92 Hours | +| 03/11/2022 | 03/11/2022 | PTO | Earned | Ongoing | 6.15 Hours | 54.77 Hours | +| 03/11/2022 | 03/11/2022 | PTO | Used | | 16.00 Hours | 48.61 Hours | +| 02/25/2022 | 02/25/2022 | PTO | Earned | Ongoing | 6.15 Hours | 64.61 Hours | +| 02/11/2022 | 02/11/2022 | PTO | Earned | Ongoing | 6.15 Hours | 58.46 Hours | +| 01/28/2022 | 01/28/2022 | PTO | Earned | Ongoing | 6.15 Hours | 52.31 Hours | +| 01/14/2022 | 01/14/2022 | PTO | Earned | Ongoing | 6.15 Hours | 46.15 Hours | +| 01/14/2022 | 01/14/2022 | FLEX | Earned | Ongoing | 8.00 Hours | 8.00 Hours | +| 01/14/2022 | 01/14/2022 | VOL | Earned | Ongoing | 0.00 Hours | 16.00 Hours | +| 01/14/2022 | 01/14/2022 | PTO | Used | | 8.00 Hours | 40.00 Hours | +| 12/30/2021 | 12/30/2021 | PTO | Earned | Ongoing | 6.15 Hours | 48.00 Hours | +| 12/30/2021 | 12/30/2021 | PTO | Used | | 8.00 Hours | 41.84 Hours | +| 12/30/2021 | 12/30/2021 | FLEX | Used | | 8.00 Hours | 0.00 Hours | +| 12/17/2021 | 12/17/2021 | PTO | Earned | Ongoing | 6.15 Hours | 49.84 Hours | +| 12/03/2021 | 12/03/2021 | PTO | Earned | Ongoing | 6.15 Hours | 43.69 Hours | +| 11/19/2021 | 11/19/2021 | PTO | Earned | Ongoing | 6.15 Hours | 37.54 Hours | +| 11/05/2021 | 11/05/2021 | PTO | Earned | Ongoing | 6.15 Hours | 31.38 Hours | +| 11/05/2021 | 11/05/2021 | SAB | Earned | Ongoing | 0.00 Hours | 0.00 Hours | +| 11/05/2021 | 11/05/2021 | SAB | Cleared | | 0.00 Hours | 0.00 Hours | +| 11/05/2021 | 11/05/2021 | PTO | Cleared | | 0.00 Hours | 25.23 Hours | +| 11/05/2021 | 11/05/2021 | PTO | Used | | 12.00 Hours | 25.23 Hours | +| 10/22/2021 | 10/22/2021 | PTO | Earned | Ongoing | 6.15 Hours | 37.23 Hours | +| 10/08/2021 | 10/08/2021 | PTO | Earned | Ongoing | 6.15 Hours | 31.07 Hours | +| 09/24/2021 | 09/24/2021 | PTO | Earned | Ongoing | 6.15 Hours | 24.92 Hours | +| 09/24/2021 | 09/24/2021 | PTO | Used | | 32.00 Hours | 18.77 Hours | +| 09/10/2021 | 09/10/2021 | PTO | Earned | Ongoing | 6.15 Hours | 50.77 Hours | +| 08/27/2021 | 08/27/2021 | PTO | Earned | Ongoing | 6.15 Hours | 44.61 Hours | +| 08/27/2021 | 08/27/2021 | PTO | Used | | 8.00 Hours | 38.46 Hours | +| 08/13/2021 | 08/13/2021 | PTO | Earned | Ongoing | 6.15 Hours | 46.46 Hours | +| 07/30/2021 | 07/30/2021 | PTO | Earned | Ongoing | 6.15 Hours | 40.30 Hours | +| 07/16/2021 | 07/16/2021 | PTO | Earned | Ongoing | 6.15 Hours | 34.15 Hours | +| 07/02/2021 | 07/02/2021 | PTO | Earned | Ongoing | 6.15 Hours | 28.00 Hours | +| 07/02/2021 | 07/02/2021 | PTO | Used | | 8.00 Hours | 21.84 Hours | +| 06/18/2021 | 06/18/2021 | PTO | Earned | Ongoing | 6.15 Hours | 29.84 Hours | +| 06/18/2021 | 06/18/2021 | PTO | Used | | 32.00 Hours | 23.69 Hours | +| 06/04/2021 | 06/04/2021 | PTO | Earned | Ongoing | 6.15 Hours | 55.69 Hours | +| 06/04/2021 | 06/04/2021 | PTO | Used | | 4.00 Hours | 49.54 Hours | +| 05/21/2021 | 05/21/2021 | PTO | Earned | Ongoing | 6.15 Hours | 53.54 Hours | +| 05/21/2021 | 05/21/2021 | PTO | Used | | 8.00 Hours | 47.38 Hours | +| 05/07/2021 | 05/07/2021 | PTO | Earned | Ongoing | 6.15 Hours | 55.38 Hours | +| 04/23/2021 | 04/23/2021 | PTO | Earned | Ongoing | 6.15 Hours | 49.23 Hours | +| 04/23/2021 | 04/23/2021 | PTO | Used | | 8.00 Hours | 43.07 Hours | +| 04/09/2021 | 04/09/2021 | PTO | Earned | Ongoing | 6.15 Hours | 51.07 Hours | +| 03/26/2021 | 03/26/2021 | PTO | Earned | Ongoing | 6.15 Hours | 44.92 Hours | +| 03/12/2021 | 03/12/2021 | PTO | Earned | Ongoing | 6.15 Hours | 38.77 Hours | +| 02/26/2021 | 02/26/2021 | PTO | Earned | Ongoing | 6.15 Hours | 32.61 Hours | +| 02/26/2021 | 02/26/2021 | PTO | Used | | 8.00 Hours | 26.46 Hours | +| 02/12/2021 | 02/12/2021 | PTO | Earned | Ongoing | 6.15 Hours | 34.46 Hours | +| 01/29/2021 | 01/29/2021 | PTO | Earned | Ongoing | 6.15 Hours | 28.30 Hours | +| 01/15/2021 | 01/15/2021 | PTO | Earned | Ongoing | 6.15 Hours | | +| 01/15/2021 | 01/15/2021 | FLEX | Earned | Ongoing | 8.00 Hours | 8.00 Hours | +| 01/15/2021 | 01/15/2021 | VOL | Earned | Ongoing | 16.00 Hours | 16.00 Hours | + +** Discrepancy since December 1st, 2023 (5-year anniversary) + +Since my rehire date, I should have been accruing PTO at the 3-5 year rate up +until the 5th annivesary of my adjusted seniority date, following which it +should have been accruing at the 5-7 year rate. It has instead been accruing at +the 0-3 year rate the entire time. + +#+name: pto-earned-discrepency +#+begin_src python :var data=paylocity-pto-history :var filename="pto-aweber-2024-discrepency.png" :results file :exports results + from datetime import datetime, date + + import pandas as pd + + + def from_hours(text) -> float | None: + try: + return float(text.split()[0]) + except (ValueError, IndexError): + return None + + + data = [ + { + "date": datetime.strptime(tdate, "%m/%d/%Y").date(), + "PTO Type": ptype, + "Trans Type": ttype, + "hours": from_hours(hours), + "available": from_hours(available), + } + for tdate, bdate, ptype, ttype, stype, hours, available in data + ] + data = pd.DataFrame(data) + pto = data[data["PTO Type"] == "PTO"] + pto = pto[(pto["Trans Type"] =="Earned") | (pto["Trans Type"] == "Used")] + pto = pto[pto["date"] > date(2022, 9, 1)] + pto = pto.pivot(index="date", columns="Trans Type", values="hours").fillna(0) + pto["Expected Earned"] = pto["Earned"] + pto.loc[pto.index == date(2023, 9, 8), "Expected Earned"] = 3.08 # (2.31 / 4.62) * 6.15 + pto.loc[pto.index > date(2023, 9, 8), "Expected Earned"] = 6.15 + pto.loc[pto.index > date(2023, 12, 1), "Expected Earned"] = 7.69 + pto["change"] = pto["Earned"] - pto["Used"] + pto["expected change"] = pto["Expected Earned"] - pto["Used"] + pto["Actual"] = pto["change"].cumsum() + pto["Expected"] = pto["expected change"].cumsum() + plot = pto[["Actual", "Expected"]].plot(title="PTO Accrual Discrepancy", xlabel="Date", ylabel="Hours") + last = pto.iloc[-1] + plot.get_legend().set_title("") + plot.text(last.name, last["Actual"], f" {last.Actual:.2f}") + plot.text(last.name, last["Expected"], f" {last.Expected:.2f}") + fig = plot.get_figure() + fig.autofmt_xdate() + fig.savefig(filename) + return filename +#+end_src + +#+RESULTS: pto-earned-discrepency +[[file:pto-aweber-2024-discrepency.png]] diff --git a/20240811193938-sailmaker_ldap.org b/20240811193938-sailmaker_ldap.org new file mode 100644 index 0000000..8bbdd7f --- /dev/null +++ b/20240811193938-sailmaker_ldap.org @@ -0,0 +1,14 @@ +:PROPERTIES: +:ID: 97f839e2-7a1a-4fba-9da8-f98801cd67cb +:END: +#+title: Sailmaker LDAP + +Handles authentication for services across the [[id:e83c1ece-35f6-414d-986f-59533fb3d6a9][Sailmaker Network]]. + +LDAP is provided using [[https://github.com/lldap/lldap][LLDAP]], a lightweight LDAP implementation with a simple UI +for configuring users and groups. +* Configuration +- URL :: http://reason.sailmaker:17170/ +- LDAP Port (plain) :: =3890= +- Base DN :: =dc=sailmaker,dc=local= +- Example DN :: =uid=correlr,ou=people,dc=sailmaker,dc=local= diff --git a/20240822235459-sailmaker_network_services.org b/20240822235459-sailmaker_network_services.org new file mode 100644 index 0000000..8e16223 --- /dev/null +++ b/20240822235459-sailmaker_network_services.org @@ -0,0 +1,36 @@ +:PROPERTIES: +:ID: 20aff805-8eab-4f77-9077-004e1fc2d5bc +:END: +#+title: Sailmaker Network Services + +Services running on the [[id:e83c1ece-35f6-414d-986f-59533fb3d6a9][Sailmaker Network]]. + +| Server | Service | Hostname | IP Address | Web UI Port | Proxy Host | Proxy Port | +|---------------+---------------------+----------+--------------+-------------+--------------------------+------------| +| PiHole | PiHole | pi.hole | 192.168.1.2 | 80 | | | +| PiHole | Uptime Kuma | pi.hole | 192.168.1.2 | 3001 | | | +| HomeAssistant | Home Assistant | | 192.168.1.13 | 8123 | home-assistant.sailmaker | 80 | +| HomeAssistant | Nginx Proxy Manager | | 192.168.1.13 | 81 | | | +| HomeAssistant | Mosquitto | | 192.168.1.13 | | | | +| Nomadix | PiHole | | 192.168.1.3 | 80 | | | +| Nomadix | Traefik | | 192.168.1.8 | 8080 | | | +| Nomadix | Wireguard | | 192.168.1.6 | 10086 | | | + +* Network Map + +- Primary services (.1 - .9) must be hosted on the Nomadix device +- Secondary services (.10 - .19) should be hosted on the Nomadix device or a standalone device +- Tertiary +| IP | Service | Role | +|--------------+-------------------+------------------------------| +| 192.168.1.1 | Internet Router | Routing | +| 192.168.1.2 | PiHole | (DNS / DHCP) | +| 192.168.1.3 | *reserved* | | +| 192.168.1.4 | *reserved* | | +| 192.168.1.5 | Proxmox (Nomadix) | Primary service host | +| 192.168.1.6 | Wireguard | VPN | +| 192.168.1.7 | LLDAP | Authentication | +| 192.168.1.8 | Proxy Manager | (inbound HTTP/HTTPS traffic) | +| 192.168.1.9 | | | +|--------------+-------------------+------------------------------| +| 192.168.1.13 | Home Assistant | Home automation | diff --git a/pto-aweber-2024-discrepency.png b/pto-aweber-2024-discrepency.png new file mode 100644 index 0000000000000000000000000000000000000000..587925d1c8fd56b569c3d1c7f14fcfcc768b1e17 GIT binary patch literal 37689 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
X5tjr4gefJx>i_yO;9_j)5+A~SBl5AxY#;pb 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 Dtm7h$ literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..cba7206 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,20 @@ +[tool.poetry] +name = "personal" +version = "0.1.0" +description = "" +authors = ["Correl Roush "] +package-mode = false + + +[tool.poetry.dependencies] +python = "^3.12" +pandas = "^2.2.2" +matplotlib = "^3.9.1" + +[tool.poetry.group.dev.dependencies] +black = "^24.4.2" +mypy = "^1.11.0" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api"