This commit is contained in:
parent
408434ece8
commit
265f03c21f
11 changed files with 139 additions and 44 deletions
|
@ -1,2 +0,0 @@
|
|||
ErrorDocument 404 /404.html
|
||||
ServerName terah.dev
|
|
@ -6,4 +6,4 @@ RUN npm run build
|
|||
FROM httpd:2.4 AS run
|
||||
WORKDIR /app
|
||||
COPY --from=build /build/dist /usr/local/apache2/htdocs
|
||||
COPY .htaccess /usr/local/apache2/htdocs
|
||||
COPY --from=build /build/httpd.conf /usr/local/apache2/conf/httpd.conf
|
||||
|
|
17
LICENSE
Normal file
17
LICENSE
Normal file
|
@ -0,0 +1,17 @@
|
|||
Copyright (c) 2025 Tera
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
90
httpd.conf
Normal file
90
httpd.conf
Normal file
|
@ -0,0 +1,90 @@
|
|||
ServerRoot "/usr/local/apache2"
|
||||
Listen 80
|
||||
|
||||
LoadModule mpm_event_module modules/mod_mpm_event.so
|
||||
LoadModule authn_file_module modules/mod_authn_file.so
|
||||
LoadModule authn_core_module modules/mod_authn_core.so
|
||||
LoadModule authz_host_module modules/mod_authz_host.so
|
||||
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
|
||||
LoadModule authz_user_module modules/mod_authz_user.so
|
||||
LoadModule authz_core_module modules/mod_authz_core.so
|
||||
LoadModule access_compat_module modules/mod_access_compat.so
|
||||
LoadModule auth_basic_module modules/mod_auth_basic.so
|
||||
LoadModule reqtimeout_module modules/mod_reqtimeout.so
|
||||
LoadModule filter_module modules/mod_filter.so
|
||||
LoadModule mime_module modules/mod_mime.so
|
||||
LoadModule log_config_module modules/mod_log_config.so
|
||||
LoadModule env_module modules/mod_env.so
|
||||
LoadModule headers_module modules/mod_headers.so
|
||||
LoadModule setenvif_module modules/mod_setenvif.so
|
||||
LoadModule version_module modules/mod_version.so
|
||||
LoadModule unixd_module modules/mod_unixd.so
|
||||
LoadModule status_module modules/mod_status.so
|
||||
LoadModule autoindex_module modules/mod_autoindex.so
|
||||
LoadModule dir_module modules/mod_dir.so
|
||||
LoadModule alias_module modules/mod_alias.so
|
||||
|
||||
<IfModule unixd_module>
|
||||
User www-data
|
||||
Group www-data
|
||||
</IfModule>
|
||||
|
||||
ServerAdmin me@terah.dev
|
||||
ServerName terah.dev:80
|
||||
|
||||
<Directory />
|
||||
AllowOverride none
|
||||
Require all denied
|
||||
</Directory>
|
||||
|
||||
DocumentRoot "/usr/local/apache2/htdocs"
|
||||
<Directory "/usr/local/apache2/htdocs">
|
||||
Options Indexes FollowSymLinks
|
||||
|
||||
AllowOverride None
|
||||
Require all granted
|
||||
</Directory>
|
||||
|
||||
<IfModule dir_module>
|
||||
DirectoryIndex index.html
|
||||
</IfModule>
|
||||
|
||||
<Files ".ht*">
|
||||
Require all denied
|
||||
</Files>
|
||||
|
||||
ErrorLog /proc/self/fd/2
|
||||
LogLevel warn
|
||||
|
||||
<IfModule log_config_module>
|
||||
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
|
||||
LogFormat "%h %l %u %t \"%r\" %>s %b" common
|
||||
|
||||
<IfModule logio_module>
|
||||
# You need to enable mod_logio.c to use %I and %O
|
||||
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
|
||||
</IfModule>
|
||||
|
||||
CustomLog /proc/self/fd/1 common
|
||||
</IfModule>
|
||||
|
||||
<IfModule headers_module>
|
||||
RequestHeader unset Proxy early
|
||||
</IfModule>
|
||||
|
||||
<IfModule mime_module>
|
||||
TypesConfig conf/mime.types
|
||||
AddType application/x-compress .Z
|
||||
AddType application/x-gzip .gz .tgz
|
||||
</IfModule>
|
||||
|
||||
ErrorDocument 404 /404.html
|
||||
|
||||
<IfModule proxy_html_module>
|
||||
Include conf/extra/proxy-html.conf
|
||||
</IfModule>
|
||||
|
||||
<IfModule ssl_module>
|
||||
SSLRandomSeed startup builtin
|
||||
SSLRandomSeed connect builtin
|
||||
</IfModule>
|
|
@ -22,7 +22,7 @@
|
|||
]
|
||||
}
|
||||
],
|
||||
"summary": "Hobbyist software developer with an affinity to server-side applications",
|
||||
"summary": "Hobbyist software developer with a love for backend systems",
|
||||
"labels": ["software developer", "homelabber"],
|
||||
"aliases": ["imterah"],
|
||||
"contact": {
|
||||
|
@ -92,10 +92,6 @@
|
|||
"residence": {
|
||||
"state": "IN",
|
||||
"countryCode": "US"
|
||||
},
|
||||
"origin": {
|
||||
"state": "KY",
|
||||
"countryCode": "US"
|
||||
}
|
||||
},
|
||||
"education": [],
|
||||
|
@ -116,6 +112,7 @@
|
|||
"name": "API",
|
||||
"summary": "The API server for Hermes.",
|
||||
"role": "Creator",
|
||||
"tags": ["resume_pdf"],
|
||||
"technologies": [
|
||||
{
|
||||
"id": "go",
|
||||
|
@ -140,6 +137,7 @@
|
|||
"name": "Backend Infrastructure",
|
||||
"summary": "Standardized system that lets you write 'backends' (methods to proxy services) in any programming language.",
|
||||
"role": "Creator",
|
||||
"tags": ["resume_pdf"],
|
||||
"technologies": [
|
||||
{
|
||||
"id": "go",
|
||||
|
|
|
@ -10,6 +10,11 @@
|
|||
'has too much servers',
|
||||
'is in love with Proxmox VE',
|
||||
'has an irrational hatred for smart toasters',
|
||||
'has a zero-Windows policy',
|
||||
'has a zero-macOS policy',
|
||||
'loves NixOS',
|
||||
'uses Arch Linux, by the way',
|
||||
'installed Gentoo twice',
|
||||
]
|
||||
const fact = facts[Math.floor(Math.random() * facts.length)] ?? ''
|
||||
|
||||
|
|
|
@ -5,10 +5,10 @@ import { recivi } from '@/stores/recivi'
|
|||
let combinedPronouns: string = ''
|
||||
|
||||
// @ts-ignore
|
||||
if (typeof recivi.bio['pronouns'] !== 'undefined') {
|
||||
// @ts-ignore
|
||||
const pronounSet = recivi.bio['pronouns'] as PronounSet[]
|
||||
const pronounSet = recivi.bio['pronouns'] as PronounSet[] | undefined
|
||||
|
||||
// @ts-ignore
|
||||
if (pronounSet !== undefined) {
|
||||
// TODO: Implement multiple set support
|
||||
if (pronounSet.length === 0) {
|
||||
combinedPronouns = 'any/all'
|
||||
|
@ -22,13 +22,16 @@ if (typeof recivi.bio['pronouns'] !== 'undefined') {
|
|||
return
|
||||
}
|
||||
|
||||
if (pronouns.pronouns.length === 0) {
|
||||
combinedPronouns = 'any/all'
|
||||
return
|
||||
}
|
||||
|
||||
// Use a common English-speaking convention of only showing the first pronoun if we have
|
||||
// multiple pronouns specified
|
||||
|
||||
if (pronouns.language == 'English') {
|
||||
if (pronouns.pronouns.length === 0) {
|
||||
return
|
||||
} else if (pronouns.pronouns.length === 1) {
|
||||
if (pronouns.pronouns.length === 1) {
|
||||
const firstPronoun = pronouns.pronouns[0]
|
||||
|
||||
if (!firstPronoun) {
|
||||
|
@ -49,8 +52,14 @@ if (typeof recivi.bio['pronouns'] !== 'undefined') {
|
|||
}
|
||||
} else {
|
||||
for (const pronounInstance of pronouns.pronouns) {
|
||||
combinedPronouns += pronounInstance.firstSet + '/'
|
||||
combinedPronouns +=
|
||||
pronounInstance.firstSet + '/' + pronounInstance.secondSet + ', '
|
||||
}
|
||||
|
||||
combinedPronouns = combinedPronouns.substring(
|
||||
0,
|
||||
combinedPronouns.length - 2
|
||||
)
|
||||
}
|
||||
}
|
||||
---
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
layout: '@/layouts/content.astro'
|
||||
|
||||
title: Home
|
||||
description: Hi! I'm Tera, a hobbyist software developer, with an affinity for Linux
|
||||
description: Hi! I'm Tera. I'm a hobbyist software developer with a love for backend systems.
|
||||
index: 0
|
||||
---
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
slug: resume
|
||||
|
||||
title: Résumé
|
||||
description: Peruse my résumé, encompassing my time developing software both as a hobbyist and full-time for many years.
|
||||
description: Peruse my résumé, encompassing my time developing software.
|
||||
index: 2
|
||||
---
|
||||
|
||||
|
@ -26,5 +26,5 @@ software. Most of it is open-source. You can find my code on various Git hosting
|
|||
sites, which are all listed on my <Link url='/'>contact page</Link>.
|
||||
|
||||
If you like what you see here and want to work with me, you can grab the
|
||||
<Link url={import.meta.env.DEV ? '/resume/pdf' : '/resume.pdf'}>PDF version</Link>
|
||||
<Link url='/resume/pdf'>PDF version</Link>
|
||||
of this résumé. Print responsibly.
|
||||
|
|
|
@ -7,15 +7,6 @@ export const GET: APIRoute = async function () {
|
|||
JSON.stringify({
|
||||
name: siteStore.title,
|
||||
start_url: '/',
|
||||
icons: [
|
||||
{ src: '/icon-512.png', type: 'image/png', sizes: '512x512' },
|
||||
{
|
||||
src: '/icon-512-maskable.png',
|
||||
type: 'image/png',
|
||||
sizes: '512x512',
|
||||
purpose: 'maskable',
|
||||
},
|
||||
],
|
||||
})
|
||||
)
|
||||
}
|
||||
|
|
|
@ -52,20 +52,6 @@ export function urlToDest(url: Url): string {
|
|||
return typeof url === 'object' && 'dest' in url ? url.dest : url
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a given country code into the country's flag emoji. This is easier
|
||||
* than mapping it to a country name, considering there can be multiple
|
||||
* representations of the name.
|
||||
*
|
||||
* @param countryCode - the ISO 3166-1 Alpha-2 code for the country
|
||||
* @returns the flag emoji
|
||||
*/
|
||||
function countryCodeDisplay(countryCode: string): string {
|
||||
return countryCode
|
||||
.toUpperCase()
|
||||
.replace(/./g, (char) => String.fromCodePoint(char.charCodeAt(0) + 127397))
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert the address into a string.
|
||||
*
|
||||
|
@ -73,12 +59,13 @@ function countryCodeDisplay(countryCode: string): string {
|
|||
* @returns the string representation of the address
|
||||
*/
|
||||
export function addressDisplay(address: Address) {
|
||||
let text = countryCodeDisplay(address.countryCode)
|
||||
let text = ''
|
||||
|
||||
if (address.state) {
|
||||
text = `${address.state}, ${text}`
|
||||
text = `${address.state}, ${address.countryCode}`
|
||||
}
|
||||
if (address.city) {
|
||||
text = `${address.city}, ${text}`
|
||||
text = `${address.city}, ${address.countryCode}`
|
||||
}
|
||||
return text
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue