Compare commits
No commits in common. "main" and "7ebdeeaa3cdcb79a1536cb17323b913500d4695c" have entirely different histories.
main
...
7ebdeeaa3c
9 changed files with 183 additions and 0 deletions
9
Dockerfile
Normal file
9
Dockerfile
Normal file
|
@ -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" ]
|
1
requirements.txt
Normal file
1
requirements.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
nicegui~=2.10
|
50
site_mcknight_tech/__main__.py
Executable file
50
site_mcknight_tech/__main__.py
Executable file
|
@ -0,0 +1,50 @@
|
||||||
|
# Copyright (C) 2025 Daniel McKnight - All Rights Reserved
|
||||||
|
|
||||||
|
from os.path import isfile, join, dirname
|
||||||
|
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
|
||||||
|
"""
|
||||||
|
file_name = join(dirname(__file__), file_name)
|
||||||
|
if not isfile(file_name):
|
||||||
|
file_name = _error_page
|
||||||
|
with open(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 = {name: ui.tab(name) for name in tab_names}
|
||||||
|
with ui.tab_panels(tabs).classes('w-full') as header:
|
||||||
|
for name, t in tab_list.items():
|
||||||
|
with ui.tab_panel(t):
|
||||||
|
render_tab(name)
|
||||||
|
return header
|
||||||
|
|
||||||
|
def main():
|
||||||
|
header = render_header()
|
||||||
|
header.set_value(list(_tab_to_content.keys())[0])
|
||||||
|
ui.run(dark=None)
|
||||||
|
|
||||||
|
|
||||||
|
main()
|
1
site_mcknight_tech/page_content/404.md
Normal file
1
site_mcknight_tech/page_content/404.md
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Oops. This content hasn't been written yet...
|
1
site_mcknight_tech/page_content/bio.md
Normal file
1
site_mcknight_tech/page_content/bio.md
Normal file
|
@ -0,0 +1 @@
|
||||||
|
## Hi!
|
19
site_mcknight_tech/page_content/home.md
Normal file
19
site_mcknight_tech/page_content/home.md
Normal file
|
@ -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)
|
||||||
|
```
|
50
site_mcknight_tech/page_content/portfolio.md
Normal file
50
site_mcknight_tech/page_content/portfolio.md
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
# 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 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.
|
||||||
|
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-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.
|
||||||
|
|
||||||
|
## This Site
|
||||||
|
I fully defined this site using [nicegui](https://nicegui.io/)!
|
52
site_mcknight_tech/page_content/resume.md
Normal file
52
site_mcknight_tech/page_content/resume.md
Normal file
|
@ -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
|
Loading…
Reference in a new issue