From ceda4cd6734aba4209171406f94cb0c0b5f8af53 Mon Sep 17 00:00:00 2001 From: d_mcknight Date: Thu, 30 Jan 2025 20:03:51 -0800 Subject: [PATCH 1/7] Initial Commit --- README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 From 53df5376506e03987923f3b3190bbe35317caf02 Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Thu, 30 Jan 2025 20:05:16 -0800 Subject: [PATCH 2/7] Initial outline with some page content --- __main__.py | 49 ++++++++++++++++++++++++++++++++++++ page_content/404.md | 1 + page_content/bio.md | 1 + page_content/home.md | 19 ++++++++++++++ page_content/portfolio.md | 32 ++++++++++++++++++++++++ page_content/resume.md | 52 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 154 insertions(+) create mode 100644 __main__.py create mode 100644 page_content/404.md create mode 100644 page_content/bio.md create mode 100644 page_content/home.md create mode 100644 page_content/portfolio.md create mode 100644 page_content/resume.md diff --git a/__main__.py b/__main__.py new file mode 100644 index 0000000..0fd2605 --- /dev/null +++ b/__main__.py @@ -0,0 +1,49 @@ +from os.path import abspath, isfile + +from nicegui import ui + +_tab_to_content = { + "Home": "page_content/home.md", + "Portfolio": "page_content/portfolio.md", + "Resume": "page_content/resume.md", + "Bio": "page_content/bio.md" +} + +_error_page = "page_content/404.md" + +def _get_content_from_file(file_name: str) -> str: + """ + Take a file name/path and return its contents + :param file_name: Relative or absolute path to a file + """ + if not isfile(abspath(file_name)): + file_name = _error_page + with open(abspath(file_name), 'r') as f: + return f.read() + +def render_tab(tab_name: str): + file_name = _tab_to_content.get(tab_name, _error_page) + ui.markdown(_get_content_from_file(file_name)) + + +def render_header() -> ui.tab_panels: + """ + Render sticky page header with navigation + """ + tab_names = _tab_to_content.keys() + with ui.tabs().classes('w-full') as tabs: + tab_list = [ui.tab(name) for name in tab_names] + with ui.tab_panels(tabs).classes('w-full') as header: + for t in tab_list: + with ui.tab_panel(t): + render_tab(t._props['name']) + return header + +def main(): + header = render_header() + header.set_value(list(_tab_to_content.keys())[0]) + ui.run(dark=None) + + +if __name__ in ("__main__", "__mp_main__"): + main() diff --git a/page_content/404.md b/page_content/404.md new file mode 100644 index 0000000..debde83 --- /dev/null +++ b/page_content/404.md @@ -0,0 +1 @@ +Oops. This content hasn't been written yet... \ No newline at end of file diff --git a/page_content/bio.md b/page_content/bio.md new file mode 100644 index 0000000..f7aa4fc --- /dev/null +++ b/page_content/bio.md @@ -0,0 +1 @@ +## Hi! diff --git a/page_content/home.md b/page_content/home.md new file mode 100644 index 0000000..75c009f --- /dev/null +++ b/page_content/home.md @@ -0,0 +1,19 @@ +# McKnight Technology Services + +Hi! This is some text + +## h2 Title +Lorem ipsum... + +> This is a quote + +### Shell +```shell +ls / +``` + +### Python +```python +for i in range(42): + print(i) +``` diff --git a/page_content/portfolio.md b/page_content/portfolio.md new file mode 100644 index 0000000..344cf9c --- /dev/null +++ b/page_content/portfolio.md @@ -0,0 +1,32 @@ +# Project Portfolio +I have developed and contributed to hundreds of open source repositories on GitHub (as well as some Private ones that +I cannot share here). This is just a selection of some of my favorite projects and what I like about them. + +## `neon-data-models` +This repository contains barely any functional code, but it was an exercise in careful planning. +It is structured into a logical hierarchy with documentation and unit tests. +This project was not fully integrated to the extent I planned, but it proved invaluable in defining/validating +messages sent between modules. The use of Pydantic also means that validator methods can be used to adapt an old-style +input into a new one when an API changes. + +## `neon-users-service` +This project defines a service for managing a user database with a flexible backend; initially, it supports SQLite for +a standalone system (and easy development/testing) and MongoDb, which is what we used for production at NeonGecko. +I implemented a very simple CRUD (Create/Read/Update/Delete) design, with RBAC (Role-Based Access Controls) to enable +easy integration with applications. The design enables the service to be easily adapted to any user database and to +allow other services to easily operate on user entries (with the proper permissions, of course). + +## `neon-hana` +This is primarily a RESTful API used to access other services. This is one of the more complex FastAPI applications +I have written; it implements JWT authentication and Pydantic models to validate requests/responses. + +## `neon-diana` +This isn't the prettiest project, but it is my first foray into writing Helm charts. The module provides some +developer-oriented CLI tools for generating Helm charts to deploy the same services NeonGecko uses in production +systems. + +## `neon-docs` +Just what it says, this is all documentation. + +## This Site +I fully defined this site using [nicegui](https://nicegui.io/)! diff --git a/page_content/resume.md b/page_content/resume.md new file mode 100644 index 0000000..21219bf --- /dev/null +++ b/page_content/resume.md @@ -0,0 +1,52 @@ +## Work Experience +### Neon Gecko Inc. +Software Developer, Developer Relations Manager, Lead Hardware Developer + +December 2017 – Present. Responsibilities Include: +- Managing multiple projects and work from individual contributors, one-off contractors, and long-term contract workers +- Working with management and developers to develop roadmaps, set timelines, and spec projects +- Extensive Python programming +- Extensive GitOps and workflow design, automation, and management +- Being fluent in voice assistant concepts and technologies +- Having a strong understanding of LLM technologies and model fine-tuning +- Deploying and maintaining infrastructure with Kubernetes, XCP-ng, and various cloud providers +- Kotlin for Android app development and Google Play Store publication +### Best Buy/Geek Squad +Consultation Agent, Sales Associate + +November 2015 - December 2017 +- Experience with Windows and Mac system administration, troubleshooting, and repair + +## Projects +- Professional open-source work can be found at: https://github.com/neondaniel +- Documentation I wrote for much of my professional work: https://neongeckocom.github.io/neon-docs/ +- A selection of small projects are documented on my blog: https://blog.mcknight.tech/ + +## Technologies +### Languages +- Python +- SQL +- MongoDb +- Kotlin +### Frameworks +- Git and GitHub +- FastAPI +- SocketIO +- Sentry +- Kubernetes + +## Education +### University of Washington +Bachelor of Science in Physics, June 2018 + +Secretary, Physics Club at UW Bothell + +### Bellevue College +Associate of Science in Engineering, June 2016 + +Member, Phi Theta Kappa Honors Society + +### Mercer Island High School +High School Diploma, June 2012 + +Recipient, Washington State Honors Award From 7ebdeeaa3cdcb79a1536cb17323b913500d4695c Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Thu, 30 Jan 2025 21:15:57 -0800 Subject: [PATCH 3/7] Refactor into module Add Dockerfile with kluges Update portfolio --- Dockerfile | 9 +++++++++ requirements.txt | 1 + site_mcknight_tech/__init__.py | 0 __main__.py => site_mcknight_tech/__main__.py | 17 +++++++++-------- .../page_content}/404.md | 0 .../page_content}/bio.md | 0 .../page_content}/home.md | 0 .../page_content}/portfolio.md | 18 ++++++++++++++++++ .../page_content}/resume.md | 0 9 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 Dockerfile create mode 100644 requirements.txt create mode 100644 site_mcknight_tech/__init__.py rename __main__.py => site_mcknight_tech/__main__.py (74%) mode change 100644 => 100755 rename {page_content => site_mcknight_tech/page_content}/404.md (100%) rename {page_content => site_mcknight_tech/page_content}/bio.md (100%) rename {page_content => site_mcknight_tech/page_content}/home.md (100%) rename {page_content => site_mcknight_tech/page_content}/portfolio.md (61%) rename {page_content => site_mcknight_tech/page_content}/resume.md (100%) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8cd58c4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM python:3.12-bookworm + +EXPOSE 8080 + +COPY site_mcknight_tech /site +COPY requirements.txt /tmp/requirements.txt +RUN pip install -r /tmp/requirements.txt + +ENTRYPOINT [ "python3", "/site/__main__.py" ] diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..0d3d37e --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +nicegui~=2.10 \ No newline at end of file diff --git a/site_mcknight_tech/__init__.py b/site_mcknight_tech/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/__main__.py b/site_mcknight_tech/__main__.py old mode 100644 new mode 100755 similarity index 74% rename from __main__.py rename to site_mcknight_tech/__main__.py index 0fd2605..c223fd7 --- a/__main__.py +++ b/site_mcknight_tech/__main__.py @@ -1,5 +1,6 @@ -from os.path import abspath, isfile +# Copyright (C) 2025 Daniel McKnight - All Rights Reserved +from os.path import isfile, join, dirname from nicegui import ui _tab_to_content = { @@ -16,9 +17,10 @@ def _get_content_from_file(file_name: str) -> str: Take a file name/path and return its contents :param file_name: Relative or absolute path to a file """ - if not isfile(abspath(file_name)): + file_name = join(dirname(__file__), file_name) + if not isfile(file_name): file_name = _error_page - with open(abspath(file_name), 'r') as f: + with open(file_name, 'r') as f: return f.read() def render_tab(tab_name: str): @@ -32,11 +34,11 @@ def render_header() -> ui.tab_panels: """ tab_names = _tab_to_content.keys() with ui.tabs().classes('w-full') as tabs: - tab_list = [ui.tab(name) for name in tab_names] + tab_list = {name: ui.tab(name) for name in tab_names} with ui.tab_panels(tabs).classes('w-full') as header: - for t in tab_list: + for name, t in tab_list.items(): with ui.tab_panel(t): - render_tab(t._props['name']) + render_tab(name) return header def main(): @@ -45,5 +47,4 @@ def main(): ui.run(dark=None) -if __name__ in ("__main__", "__mp_main__"): - main() +main() diff --git a/page_content/404.md b/site_mcknight_tech/page_content/404.md similarity index 100% rename from page_content/404.md rename to site_mcknight_tech/page_content/404.md diff --git a/page_content/bio.md b/site_mcknight_tech/page_content/bio.md similarity index 100% rename from page_content/bio.md rename to site_mcknight_tech/page_content/bio.md diff --git a/page_content/home.md b/site_mcknight_tech/page_content/home.md similarity index 100% rename from page_content/home.md rename to site_mcknight_tech/page_content/home.md diff --git a/page_content/portfolio.md b/site_mcknight_tech/page_content/portfolio.md similarity index 61% rename from page_content/portfolio.md rename to site_mcknight_tech/page_content/portfolio.md index 344cf9c..4e37062 100644 --- a/page_content/portfolio.md +++ b/site_mcknight_tech/page_content/portfolio.md @@ -2,6 +2,13 @@ I have developed and contributed to hundreds of open source repositories on GitHub (as well as some Private ones that I cannot share here). This is just a selection of some of my favorite projects and what I like about them. +## Neon Core +This is the primary project I contributed to as part of my work at NeonGecko. It started as work with the (now defunct) +open source Mycroft AI project, turned into a proprietary fork, and then we ended up open sourcing that fork. Working on +this project, I learned a lot about contributing to open source and managing open source projects. At the start, I learned +how to be a helpful individual contributor, and later I was on the other side, learning how to interface with the community +to balance internal goals with community feedback. + ## `neon-data-models` This repository contains barely any functional code, but it was an exercise in careful planning. It is structured into a logical hierarchy with documentation and unit tests. @@ -25,6 +32,17 @@ This isn't the prettiest project, but it is my first foray into writing Helm cha developer-oriented CLI tools for generating Helm charts to deploy the same services NeonGecko uses in production systems. +## `neon-debos` +This project was my first foray into Go templates. It started as a fork of another similar project which I adapted to +our needs. As part of this project, I used squashfs/overlayfs to enable safe OS updates with methods to roll-back or +reset an installation in case of any errors. To support this, I compiled custom kernels and implemented a customized +initramfs. + +## `.github` +This repository contains a number of shared GitHub Actions, in addition to the standard issue templates and other special +files GitHub supports here. Creating this repository was part of an effort to consolidate code and make sprawling +repositories more manageable. + ## `neon-docs` Just what it says, this is all documentation. diff --git a/page_content/resume.md b/site_mcknight_tech/page_content/resume.md similarity index 100% rename from page_content/resume.md rename to site_mcknight_tech/page_content/resume.md From c21f53d3e37da1094cb47d66b12f68195d7a0882 Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Thu, 30 Jan 2025 21:34:55 -0800 Subject: [PATCH 4/7] Fix list formatting --- site_mcknight_tech/__main__.py | 2 +- site_mcknight_tech/page_content/resume.md | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/site_mcknight_tech/__main__.py b/site_mcknight_tech/__main__.py index c223fd7..6a76388 100755 --- a/site_mcknight_tech/__main__.py +++ b/site_mcknight_tech/__main__.py @@ -25,7 +25,7 @@ def _get_content_from_file(file_name: str) -> str: def render_tab(tab_name: str): file_name = _tab_to_content.get(tab_name, _error_page) - ui.markdown(_get_content_from_file(file_name)) + ui.markdown(_get_content_from_file(file_name), extras=['cuddled-lists', 'fenced-code-blocks', 'tables']) def render_header() -> ui.tab_panels: diff --git a/site_mcknight_tech/page_content/resume.md b/site_mcknight_tech/page_content/resume.md index 21219bf..d03694f 100644 --- a/site_mcknight_tech/page_content/resume.md +++ b/site_mcknight_tech/page_content/resume.md @@ -3,6 +3,7 @@ Software Developer, Developer Relations Manager, Lead Hardware Developer December 2017 – Present. Responsibilities Include: + - Managing multiple projects and work from individual contributors, one-off contractors, and long-term contract workers - Working with management and developers to develop roadmaps, set timelines, and spec projects - Extensive Python programming @@ -11,10 +12,12 @@ December 2017 – Present. Responsibilities Include: - Having a strong understanding of LLM technologies and model fine-tuning - Deploying and maintaining infrastructure with Kubernetes, XCP-ng, and various cloud providers - Kotlin for Android app development and Google Play Store publication + ### Best Buy/Geek Squad Consultation Agent, Sales Associate November 2015 - December 2017 + - Experience with Windows and Mac system administration, troubleshooting, and repair ## Projects @@ -28,6 +31,7 @@ November 2015 - December 2017 - SQL - MongoDb - Kotlin + ### Frameworks - Git and GitHub - FastAPI From 2be144c37876b63e78c0a1b666ca24c5ce258144 Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Thu, 30 Jan 2025 20:05:16 -0800 Subject: [PATCH 5/7] Initial outline with some page content --- __main__.py | 49 ++++++++++++++++++++++++++++++++++++ page_content/404.md | 1 + page_content/bio.md | 1 + page_content/home.md | 19 ++++++++++++++ page_content/portfolio.md | 32 ++++++++++++++++++++++++ page_content/resume.md | 52 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 154 insertions(+) create mode 100644 __main__.py create mode 100644 page_content/404.md create mode 100644 page_content/bio.md create mode 100644 page_content/home.md create mode 100644 page_content/portfolio.md create mode 100644 page_content/resume.md diff --git a/__main__.py b/__main__.py new file mode 100644 index 0000000..0fd2605 --- /dev/null +++ b/__main__.py @@ -0,0 +1,49 @@ +from os.path import abspath, isfile + +from nicegui import ui + +_tab_to_content = { + "Home": "page_content/home.md", + "Portfolio": "page_content/portfolio.md", + "Resume": "page_content/resume.md", + "Bio": "page_content/bio.md" +} + +_error_page = "page_content/404.md" + +def _get_content_from_file(file_name: str) -> str: + """ + Take a file name/path and return its contents + :param file_name: Relative or absolute path to a file + """ + if not isfile(abspath(file_name)): + file_name = _error_page + with open(abspath(file_name), 'r') as f: + return f.read() + +def render_tab(tab_name: str): + file_name = _tab_to_content.get(tab_name, _error_page) + ui.markdown(_get_content_from_file(file_name)) + + +def render_header() -> ui.tab_panels: + """ + Render sticky page header with navigation + """ + tab_names = _tab_to_content.keys() + with ui.tabs().classes('w-full') as tabs: + tab_list = [ui.tab(name) for name in tab_names] + with ui.tab_panels(tabs).classes('w-full') as header: + for t in tab_list: + with ui.tab_panel(t): + render_tab(t._props['name']) + return header + +def main(): + header = render_header() + header.set_value(list(_tab_to_content.keys())[0]) + ui.run(dark=None) + + +if __name__ in ("__main__", "__mp_main__"): + main() diff --git a/page_content/404.md b/page_content/404.md new file mode 100644 index 0000000..debde83 --- /dev/null +++ b/page_content/404.md @@ -0,0 +1 @@ +Oops. This content hasn't been written yet... \ No newline at end of file diff --git a/page_content/bio.md b/page_content/bio.md new file mode 100644 index 0000000..f7aa4fc --- /dev/null +++ b/page_content/bio.md @@ -0,0 +1 @@ +## Hi! diff --git a/page_content/home.md b/page_content/home.md new file mode 100644 index 0000000..75c009f --- /dev/null +++ b/page_content/home.md @@ -0,0 +1,19 @@ +# McKnight Technology Services + +Hi! This is some text + +## h2 Title +Lorem ipsum... + +> This is a quote + +### Shell +```shell +ls / +``` + +### Python +```python +for i in range(42): + print(i) +``` diff --git a/page_content/portfolio.md b/page_content/portfolio.md new file mode 100644 index 0000000..344cf9c --- /dev/null +++ b/page_content/portfolio.md @@ -0,0 +1,32 @@ +# Project Portfolio +I have developed and contributed to hundreds of open source repositories on GitHub (as well as some Private ones that +I cannot share here). This is just a selection of some of my favorite projects and what I like about them. + +## `neon-data-models` +This repository contains barely any functional code, but it was an exercise in careful planning. +It is structured into a logical hierarchy with documentation and unit tests. +This project was not fully integrated to the extent I planned, but it proved invaluable in defining/validating +messages sent between modules. The use of Pydantic also means that validator methods can be used to adapt an old-style +input into a new one when an API changes. + +## `neon-users-service` +This project defines a service for managing a user database with a flexible backend; initially, it supports SQLite for +a standalone system (and easy development/testing) and MongoDb, which is what we used for production at NeonGecko. +I implemented a very simple CRUD (Create/Read/Update/Delete) design, with RBAC (Role-Based Access Controls) to enable +easy integration with applications. The design enables the service to be easily adapted to any user database and to +allow other services to easily operate on user entries (with the proper permissions, of course). + +## `neon-hana` +This is primarily a RESTful API used to access other services. This is one of the more complex FastAPI applications +I have written; it implements JWT authentication and Pydantic models to validate requests/responses. + +## `neon-diana` +This isn't the prettiest project, but it is my first foray into writing Helm charts. The module provides some +developer-oriented CLI tools for generating Helm charts to deploy the same services NeonGecko uses in production +systems. + +## `neon-docs` +Just what it says, this is all documentation. + +## This Site +I fully defined this site using [nicegui](https://nicegui.io/)! diff --git a/page_content/resume.md b/page_content/resume.md new file mode 100644 index 0000000..21219bf --- /dev/null +++ b/page_content/resume.md @@ -0,0 +1,52 @@ +## Work Experience +### Neon Gecko Inc. +Software Developer, Developer Relations Manager, Lead Hardware Developer + +December 2017 – Present. Responsibilities Include: +- Managing multiple projects and work from individual contributors, one-off contractors, and long-term contract workers +- Working with management and developers to develop roadmaps, set timelines, and spec projects +- Extensive Python programming +- Extensive GitOps and workflow design, automation, and management +- Being fluent in voice assistant concepts and technologies +- Having a strong understanding of LLM technologies and model fine-tuning +- Deploying and maintaining infrastructure with Kubernetes, XCP-ng, and various cloud providers +- Kotlin for Android app development and Google Play Store publication +### Best Buy/Geek Squad +Consultation Agent, Sales Associate + +November 2015 - December 2017 +- Experience with Windows and Mac system administration, troubleshooting, and repair + +## Projects +- Professional open-source work can be found at: https://github.com/neondaniel +- Documentation I wrote for much of my professional work: https://neongeckocom.github.io/neon-docs/ +- A selection of small projects are documented on my blog: https://blog.mcknight.tech/ + +## Technologies +### Languages +- Python +- SQL +- MongoDb +- Kotlin +### Frameworks +- Git and GitHub +- FastAPI +- SocketIO +- Sentry +- Kubernetes + +## Education +### University of Washington +Bachelor of Science in Physics, June 2018 + +Secretary, Physics Club at UW Bothell + +### Bellevue College +Associate of Science in Engineering, June 2016 + +Member, Phi Theta Kappa Honors Society + +### Mercer Island High School +High School Diploma, June 2012 + +Recipient, Washington State Honors Award From 53895b6f65e8bdb912ddaf6d283c7d86ad5646d2 Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Thu, 30 Jan 2025 21:15:57 -0800 Subject: [PATCH 6/7] Refactor into module Add Dockerfile with kluges Update portfolio --- Dockerfile | 9 +++++++++ requirements.txt | 1 + site_mcknight_tech/__init__.py | 0 __main__.py => site_mcknight_tech/__main__.py | 17 +++++++++-------- .../page_content}/404.md | 0 .../page_content}/bio.md | 0 .../page_content}/home.md | 0 .../page_content}/portfolio.md | 18 ++++++++++++++++++ .../page_content}/resume.md | 0 9 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 Dockerfile create mode 100644 requirements.txt create mode 100644 site_mcknight_tech/__init__.py rename __main__.py => site_mcknight_tech/__main__.py (74%) mode change 100644 => 100755 rename {page_content => site_mcknight_tech/page_content}/404.md (100%) rename {page_content => site_mcknight_tech/page_content}/bio.md (100%) rename {page_content => site_mcknight_tech/page_content}/home.md (100%) rename {page_content => site_mcknight_tech/page_content}/portfolio.md (61%) rename {page_content => site_mcknight_tech/page_content}/resume.md (100%) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8cd58c4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM python:3.12-bookworm + +EXPOSE 8080 + +COPY site_mcknight_tech /site +COPY requirements.txt /tmp/requirements.txt +RUN pip install -r /tmp/requirements.txt + +ENTRYPOINT [ "python3", "/site/__main__.py" ] diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..0d3d37e --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +nicegui~=2.10 \ No newline at end of file diff --git a/site_mcknight_tech/__init__.py b/site_mcknight_tech/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/__main__.py b/site_mcknight_tech/__main__.py old mode 100644 new mode 100755 similarity index 74% rename from __main__.py rename to site_mcknight_tech/__main__.py index 0fd2605..c223fd7 --- a/__main__.py +++ b/site_mcknight_tech/__main__.py @@ -1,5 +1,6 @@ -from os.path import abspath, isfile +# Copyright (C) 2025 Daniel McKnight - All Rights Reserved +from os.path import isfile, join, dirname from nicegui import ui _tab_to_content = { @@ -16,9 +17,10 @@ def _get_content_from_file(file_name: str) -> str: Take a file name/path and return its contents :param file_name: Relative or absolute path to a file """ - if not isfile(abspath(file_name)): + file_name = join(dirname(__file__), file_name) + if not isfile(file_name): file_name = _error_page - with open(abspath(file_name), 'r') as f: + with open(file_name, 'r') as f: return f.read() def render_tab(tab_name: str): @@ -32,11 +34,11 @@ def render_header() -> ui.tab_panels: """ tab_names = _tab_to_content.keys() with ui.tabs().classes('w-full') as tabs: - tab_list = [ui.tab(name) for name in tab_names] + tab_list = {name: ui.tab(name) for name in tab_names} with ui.tab_panels(tabs).classes('w-full') as header: - for t in tab_list: + for name, t in tab_list.items(): with ui.tab_panel(t): - render_tab(t._props['name']) + render_tab(name) return header def main(): @@ -45,5 +47,4 @@ def main(): ui.run(dark=None) -if __name__ in ("__main__", "__mp_main__"): - main() +main() diff --git a/page_content/404.md b/site_mcknight_tech/page_content/404.md similarity index 100% rename from page_content/404.md rename to site_mcknight_tech/page_content/404.md diff --git a/page_content/bio.md b/site_mcknight_tech/page_content/bio.md similarity index 100% rename from page_content/bio.md rename to site_mcknight_tech/page_content/bio.md diff --git a/page_content/home.md b/site_mcknight_tech/page_content/home.md similarity index 100% rename from page_content/home.md rename to site_mcknight_tech/page_content/home.md diff --git a/page_content/portfolio.md b/site_mcknight_tech/page_content/portfolio.md similarity index 61% rename from page_content/portfolio.md rename to site_mcknight_tech/page_content/portfolio.md index 344cf9c..4e37062 100644 --- a/page_content/portfolio.md +++ b/site_mcknight_tech/page_content/portfolio.md @@ -2,6 +2,13 @@ I have developed and contributed to hundreds of open source repositories on GitHub (as well as some Private ones that I cannot share here). This is just a selection of some of my favorite projects and what I like about them. +## Neon Core +This is the primary project I contributed to as part of my work at NeonGecko. It started as work with the (now defunct) +open source Mycroft AI project, turned into a proprietary fork, and then we ended up open sourcing that fork. Working on +this project, I learned a lot about contributing to open source and managing open source projects. At the start, I learned +how to be a helpful individual contributor, and later I was on the other side, learning how to interface with the community +to balance internal goals with community feedback. + ## `neon-data-models` This repository contains barely any functional code, but it was an exercise in careful planning. It is structured into a logical hierarchy with documentation and unit tests. @@ -25,6 +32,17 @@ This isn't the prettiest project, but it is my first foray into writing Helm cha developer-oriented CLI tools for generating Helm charts to deploy the same services NeonGecko uses in production systems. +## `neon-debos` +This project was my first foray into Go templates. It started as a fork of another similar project which I adapted to +our needs. As part of this project, I used squashfs/overlayfs to enable safe OS updates with methods to roll-back or +reset an installation in case of any errors. To support this, I compiled custom kernels and implemented a customized +initramfs. + +## `.github` +This repository contains a number of shared GitHub Actions, in addition to the standard issue templates and other special +files GitHub supports here. Creating this repository was part of an effort to consolidate code and make sprawling +repositories more manageable. + ## `neon-docs` Just what it says, this is all documentation. diff --git a/page_content/resume.md b/site_mcknight_tech/page_content/resume.md similarity index 100% rename from page_content/resume.md rename to site_mcknight_tech/page_content/resume.md From 8ccdde5cb127a5cb2261c205860248f46198e2a6 Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Thu, 30 Jan 2025 21:34:55 -0800 Subject: [PATCH 7/7] Fix list formatting --- site_mcknight_tech/__main__.py | 2 +- site_mcknight_tech/page_content/resume.md | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/site_mcknight_tech/__main__.py b/site_mcknight_tech/__main__.py index c223fd7..6a76388 100755 --- a/site_mcknight_tech/__main__.py +++ b/site_mcknight_tech/__main__.py @@ -25,7 +25,7 @@ def _get_content_from_file(file_name: str) -> str: def render_tab(tab_name: str): file_name = _tab_to_content.get(tab_name, _error_page) - ui.markdown(_get_content_from_file(file_name)) + ui.markdown(_get_content_from_file(file_name), extras=['cuddled-lists', 'fenced-code-blocks', 'tables']) def render_header() -> ui.tab_panels: diff --git a/site_mcknight_tech/page_content/resume.md b/site_mcknight_tech/page_content/resume.md index 21219bf..d03694f 100644 --- a/site_mcknight_tech/page_content/resume.md +++ b/site_mcknight_tech/page_content/resume.md @@ -3,6 +3,7 @@ Software Developer, Developer Relations Manager, Lead Hardware Developer December 2017 – Present. Responsibilities Include: + - Managing multiple projects and work from individual contributors, one-off contractors, and long-term contract workers - Working with management and developers to develop roadmaps, set timelines, and spec projects - Extensive Python programming @@ -11,10 +12,12 @@ December 2017 – Present. Responsibilities Include: - Having a strong understanding of LLM technologies and model fine-tuning - Deploying and maintaining infrastructure with Kubernetes, XCP-ng, and various cloud providers - Kotlin for Android app development and Google Play Store publication + ### Best Buy/Geek Squad Consultation Agent, Sales Associate November 2015 - December 2017 + - Experience with Windows and Mac system administration, troubleshooting, and repair ## Projects @@ -28,6 +31,7 @@ November 2015 - December 2017 - SQL - MongoDb - Kotlin + ### Frameworks - Git and GitHub - FastAPI