WIP: Website Initial Implementation #1
					 6 changed files with 154 additions and 0 deletions
				
			
		
							
								
								
									
										49
									
								
								__main__.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								__main__.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -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() | ||||||
							
								
								
									
										1
									
								
								page_content/404.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								page_content/404.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | Oops. This content hasn't been written yet... | ||||||
							
								
								
									
										1
									
								
								page_content/bio.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								page_content/bio.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | ## Hi! | ||||||
							
								
								
									
										19
									
								
								page_content/home.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								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) | ||||||
|  | ``` | ||||||
							
								
								
									
										32
									
								
								page_content/portfolio.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								page_content/portfolio.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -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/)! | ||||||
							
								
								
									
										52
									
								
								page_content/resume.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								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…
	
	Add table
		Add a link
		
	
		Reference in a new issue