working markdown to html
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -1 +1,5 @@
|
|||||||
|
# Dont commit compiled binaries
|
||||||
/target
|
/target
|
||||||
|
|
||||||
|
# For nixos direnv
|
||||||
|
.envrc
|
||||||
87
Cargo.lock
generated
87
Cargo.lock
generated
@@ -2,6 +2,48 @@
|
|||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
version = 4
|
version = 4
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "askama"
|
||||||
|
version = "0.14.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f75363874b771be265f4ffe307ca705ef6f3baa19011c149da8674a87f1b75c4"
|
||||||
|
dependencies = [
|
||||||
|
"askama_derive",
|
||||||
|
"itoa",
|
||||||
|
"percent-encoding",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "askama_derive"
|
||||||
|
version = "0.14.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "129397200fe83088e8a68407a8e2b1f826cf0086b21ccdb866a722c8bcd3a94f"
|
||||||
|
dependencies = [
|
||||||
|
"askama_parser",
|
||||||
|
"basic-toml",
|
||||||
|
"memchr",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"rustc-hash",
|
||||||
|
"serde",
|
||||||
|
"serde_derive",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "askama_parser"
|
||||||
|
version = "0.14.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d6ab5630b3d5eaf232620167977f95eb51f3432fc76852328774afbd242d4358"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
"serde",
|
||||||
|
"serde_derive",
|
||||||
|
"winnow",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "atomic-waker"
|
name = "atomic-waker"
|
||||||
version = "1.1.2"
|
version = "1.1.2"
|
||||||
@@ -60,6 +102,15 @@ dependencies = [
|
|||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "basic-toml"
|
||||||
|
version = "0.1.10"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bitflags"
|
name = "bitflags"
|
||||||
version = "2.10.0"
|
version = "2.10.0"
|
||||||
@@ -309,9 +360,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.105"
|
version = "1.0.106"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7"
|
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
@@ -337,13 +388,19 @@ checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quote"
|
name = "quote"
|
||||||
version = "1.0.43"
|
version = "1.0.44"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a"
|
checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustc-hash"
|
||||||
|
version = "2.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ryu"
|
name = "ryu"
|
||||||
version = "1.0.22"
|
version = "1.0.22"
|
||||||
@@ -419,9 +476,12 @@ dependencies = [
|
|||||||
name = "site"
|
name = "site"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"askama",
|
||||||
"axum",
|
"axum",
|
||||||
"markdown",
|
"markdown",
|
||||||
"pulldown-cmark",
|
"pulldown-cmark",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tower-http",
|
"tower-http",
|
||||||
]
|
]
|
||||||
@@ -434,9 +494,9 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "socket2"
|
name = "socket2"
|
||||||
version = "0.6.1"
|
version = "0.6.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881"
|
checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"windows-sys 0.60.2",
|
"windows-sys 0.60.2",
|
||||||
@@ -691,7 +751,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
|
checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zmij"
|
name = "winnow"
|
||||||
version = "1.0.13"
|
version = "0.7.14"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ac93432f5b761b22864c774aac244fa5c0fd877678a4c37ebf6cf42208f9c9ec"
|
checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "zmij"
|
||||||
|
version = "1.0.16"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "dfcd145825aace48cff44a8844de64bf75feec3080e0aa5cdbde72961ae51a65"
|
||||||
|
|||||||
@@ -9,3 +9,6 @@ markdown = "1.0.0"
|
|||||||
pulldown-cmark = "0.13.0"
|
pulldown-cmark = "0.13.0"
|
||||||
tokio = { version = "1.49.0", features = ["macros", "rt-multi-thread"] }
|
tokio = { version = "1.49.0", features = ["macros", "rt-multi-thread"] }
|
||||||
tower-http = { version = "0.5", features = ["fs"] }
|
tower-http = { version = "0.5", features = ["fs"] }
|
||||||
|
askama = "0.14.0"
|
||||||
|
serde_json = "1.0.149"
|
||||||
|
serde = "1.0.228"
|
||||||
2
rust-toolchain.toml
Normal file
2
rust-toolchain.toml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
[toolchain]
|
||||||
|
channel = "stable"
|
||||||
47
shell.nix
Normal file
47
shell.nix
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
{ pkgs ? import <nixpkgs> {} }:
|
||||||
|
let
|
||||||
|
overrides = (builtins.fromTOML (builtins.readFile ./rust-toolchain.toml));
|
||||||
|
libPath = with pkgs; lib.makeLibraryPath [
|
||||||
|
# load external libraries that you need in your rust project here
|
||||||
|
];
|
||||||
|
in
|
||||||
|
pkgs.mkShell rec {
|
||||||
|
nativeBuildInputs = [ pkgs.pkg-config ];
|
||||||
|
buildInputs = with pkgs; [
|
||||||
|
clang
|
||||||
|
# Replace llvmPackages with llvmPackages_X, where X is the latest LLVM version (at the time of writing, 16)
|
||||||
|
llvmPackages.bintools
|
||||||
|
rustup
|
||||||
|
];
|
||||||
|
|
||||||
|
RUSTC_VERSION = overrides.toolchain.channel;
|
||||||
|
|
||||||
|
# https://github.com/rust-lang/rust-bindgen#environment-variables
|
||||||
|
LIBCLANG_PATH = pkgs.lib.makeLibraryPath [ pkgs.llvmPackages_latest.libclang.lib ];
|
||||||
|
|
||||||
|
shellHook = ''
|
||||||
|
export PATH=$PATH:''${CARGO_HOME:-~/.cargo}/bin
|
||||||
|
export PATH=$PATH:''${RUSTUP_HOME:-~/.rustup}/toolchains/$RUSTC_VERSION-x86_64-unknown-linux-gnu/bin/
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Add precompiled library to rustc search path
|
||||||
|
RUSTFLAGS = (builtins.map (a: ''-L ${a}/lib'') [
|
||||||
|
# add libraries here (e.g. pkgs.libvmi)
|
||||||
|
]);
|
||||||
|
|
||||||
|
LD_LIBRARY_PATH = libPath;
|
||||||
|
|
||||||
|
# Add glibc, clang, glib, and other headers to bindgen search path
|
||||||
|
BINDGEN_EXTRA_CLANG_ARGS =
|
||||||
|
# Includes normal include path
|
||||||
|
(builtins.map (a: ''-I"${a}/include"'') [
|
||||||
|
# add dev libraries here (e.g. pkgs.libvmi.dev)
|
||||||
|
pkgs.glibc.dev
|
||||||
|
])
|
||||||
|
# Includes with special directory paths
|
||||||
|
++ [
|
||||||
|
''-I"${pkgs.llvmPackages_latest.libclang.lib}/lib/clang/${pkgs.llvmPackages_latest.libclang.version}/include"''
|
||||||
|
''-I"${pkgs.glib.dev}/include/glib-2.0"''
|
||||||
|
''-I${pkgs.glib.out}/lib/glib-2.0/include/''
|
||||||
|
];
|
||||||
|
}
|
||||||
36
src/main.rs
36
src/main.rs
@@ -1,22 +1,38 @@
|
|||||||
use axum::{
|
use axum::{
|
||||||
routing::get,
|
Router, response::Html, routing::get
|
||||||
Router,
|
|
||||||
response::Html,
|
|
||||||
};
|
};
|
||||||
use tower_http::services::ServeDir;
|
use tower_http::services::ServeDir;
|
||||||
|
use askama::Template;
|
||||||
|
use markdown::to_html;
|
||||||
|
use std::fs;
|
||||||
|
|
||||||
|
|
||||||
|
// Template for home
|
||||||
|
#[derive(Template)]
|
||||||
|
#[template(path = "home.html", ext = "html")]
|
||||||
|
struct HomeTemplate {
|
||||||
|
content: String
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() {
|
async fn main() {
|
||||||
let site = Router::new()
|
|
||||||
.route("/", get(home))
|
let home_html = Html(
|
||||||
|
HomeTemplate {
|
||||||
|
content: to_html(&fs::read_to_string(
|
||||||
|
"static/strings/home.md"
|
||||||
|
).expect("Couldnt read file"))
|
||||||
|
}.render().unwrap()
|
||||||
|
);
|
||||||
|
|
||||||
|
let site: Router = Router::new()
|
||||||
|
.route("/", get(home_html))
|
||||||
.nest_service("/static", ServeDir::new("static"));
|
.nest_service("/static", ServeDir::new("static"));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
|
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
|
||||||
println!("Running on http://127.0.0.1:3000");
|
println!("Running on http://127.0.0.1:3000");
|
||||||
axum::serve(listener, site).await.unwrap();
|
axum::serve(listener, site).await.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn home() -> Html<&'static str> {
|
|
||||||
const HTML: &'static str = include_str!("../static/home.html");
|
|
||||||
Html(HTML)
|
|
||||||
}
|
|
||||||
|
|||||||
377
static/home.html
377
static/home.html
@@ -1,377 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<link rel="stylesheet" href="/static/style.css"
|
|
||||||
<meta charset="utf-8"/>
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
||||||
|
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
||||||
<link href="https://fonts.googleapis.com/css2?family=Pixelify+Sans:wght@400..700&display=swap" rel="stylesheet">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<header>
|
|
||||||
<nav>
|
|
||||||
<ul>
|
|
||||||
<li>Posts</li>
|
|
||||||
<li>Contact</li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</header>
|
|
||||||
<div>
|
|
||||||
<p id="name">Jeremy Janella</p>
|
|
||||||
<h3>About me</h3>
|
|
||||||
<!-- <p>Computers, mountain bikes, adventurer, hard sci-fi enjoyer, ethics, swimming, jumper</p> -->
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- <div id="Game" class="align-left card">
|
|
||||||
<h1>Game Development</h1>
|
|
||||||
<div style="float: right; padding: 20px; width: 10vw;">
|
|
||||||
<img
|
|
||||||
src="/src/lib/game/chunkfunc.webp"
|
|
||||||
style="width: max-content;"
|
|
||||||
alt="Zoomed out chunk generation"
|
|
||||||
/>
|
|
||||||
<p class="center">Prototype terrain sample</p>
|
|
||||||
</div>
|
|
||||||
<p class="indent">
|
|
||||||
I am currently developing an underground-submarine openworld multiplayer
|
|
||||||
physics inspired game. As a gamer and enjoyer of large, rich maps and
|
|
||||||
depth to gameplay, I would really like to say thats what I started out
|
|
||||||
trying to create. Instead, the story goes that I had this random idea
|
|
||||||
for terrain manipulation. Games like Minecraft and Terraria use squares
|
|
||||||
and cubes, which just feels boring in my opinion. I thought I could do
|
|
||||||
something much more <i>visceral</i> As a sort of tech-demo/proof of
|
|
||||||
concept I programmed a shape that could be modified by boolean geometry
|
|
||||||
operations, mainly union and subtract with a second polygon. This led to
|
|
||||||
a very interesting, but quickly boring "game" to hop around in. However,
|
|
||||||
since I could drill through and place prettymuch any shape I wanted to,
|
|
||||||
it felt like I could "fly" through the land, much like a submarine
|
|
||||||
"flies" through water.<br /><br />I implemented some modularly built
|
|
||||||
vehicles with use of graphs theory and object oriented programming, and
|
|
||||||
terrain generation using cellular noise. The reason I used cellular
|
|
||||||
noise is because if you look at the lines between cells, they form a
|
|
||||||
network without dead ends. Then by applying an algorithm using a density
|
|
||||||
function on depth I am able to fine tune the width and density of the
|
|
||||||
caves without impacting their interconnectedness. By using this method
|
|
||||||
chunks can generate completely independent of their neighbor, which is
|
|
||||||
optimal.<br /><br />"Multiplayer is the hardest part of game dev, maybe
|
|
||||||
release that later" I have been told by a lot of people. However, as a
|
|
||||||
hobby-server configurer and network security nerd, I thought I could
|
|
||||||
take it on. I was right, however as a network security nerd I have more
|
|
||||||
layers of firewalls than I do braincells. Every single time I have an
|
|
||||||
issue with networking, its a firewall. Once I found which ports were
|
|
||||||
blocked, yes multiplayer was easy.<br /><br />The result? I could fly
|
|
||||||
drilling vehicles through terrain, pop out of the ground or into random
|
|
||||||
caves, mine materials, play hide and seek with friends, and even orbit
|
|
||||||
the planet. One of the things important to me in this game was accurate
|
|
||||||
physics: thrust, torque, gravity, mass, all the fun stuff. While I am a
|
|
||||||
physics minor, I am more importantly a heavy player of physics and
|
|
||||||
rocket science games such as Kerbal Space Program. I was able to glide
|
|
||||||
through AP physics simply because it
|
|
||||||
<i>just part of the games world</i>, it included everything we would
|
|
||||||
learn in the classroom. Realistic physics also added to the depth of
|
|
||||||
gameplay I was looking for.<br /><br /> After some formal computer
|
|
||||||
science education, I discovered new ways to more efficiently implement
|
|
||||||
many of the algorithms I had initially generated and rewrote them
|
|
||||||
...multiple times. Currently everything runs <i>buttery smooth</i> and
|
|
||||||
framerates are high due to efficient caching of unloaded chunks,
|
|
||||||
multithreaded chunk generation, gpu accelerated compute shaders to
|
|
||||||
modify chunk density, enhanced use of object oriented programing and
|
|
||||||
graph algorithms to build massive modular vehicles, authoritative server
|
|
||||||
networking to disable hackers, and other performance tweaks.<br /><br />
|
|
||||||
So this sounds amazing, where's the game? Well, a game needs graphics, audio,
|
|
||||||
a sound track. As much as I'd love to release it now, its unplayable for
|
|
||||||
these reasons along with a few minor implementations left such as NPC's and
|
|
||||||
reworking the tech tree.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<div class="center">
|
|
||||||
<img
|
|
||||||
src="/src/lib/game/flying.webp"
|
|
||||||
style="width: 100%; max-width: 600px"
|
|
||||||
alt="Flying Vehicle"
|
|
||||||
/>
|
|
||||||
<p>A grid flying through caves</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="Servers" class="align-right card">
|
|
||||||
<h1>Servers & Networking</h1>
|
|
||||||
<p>
|
|
||||||
Open source and networking hobbies led me to depoly a set of
|
|
||||||
interconnected Linux servers:
|
|
||||||
</p>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<h3>NGINX Reverse Proxy and VPN Server</h3>
|
|
||||||
<p>
|
|
||||||
This server is the internets access to all of my other servers,
|
|
||||||
and the glue holding them together. I was using IPTables briefly
|
|
||||||
but have moved to NGINX to forward traffic from specified ports
|
|
||||||
onto private servers connected to it. This device doubles as a <a
|
|
||||||
href="https://www.wireguard.com/">Wireguard VPN</a
|
|
||||||
> server which in the past connected servers on the same virtual
|
|
||||||
network, however I have switched to reverse ssh tunnels to connect
|
|
||||||
other servers to this one. The VPN is still useful for odd networking
|
|
||||||
tasks and troubleshooting.
|
|
||||||
</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<h3>Lightweight Server</h3>
|
|
||||||
<p>
|
|
||||||
Running on Raspberry Pi, this servers main job is to run
|
|
||||||
Subterstrike servers, Minecraft servers, other game servers, and
|
|
||||||
this website you're looking at.
|
|
||||||
</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<h3>AI & FTP Server</h3>
|
|
||||||
<p>
|
|
||||||
A powerful computer with an RX 6950 XT GPU runs my local
|
|
||||||
generative AI servers including <a
|
|
||||||
href="https://invoke-ai.github.io/InvokeAI/">Invoke AI</a
|
|
||||||
>
|
|
||||||
for Image Generation,
|
|
||||||
<a href="https://ollama.com/?ref=useaiforit">Ollama</a>
|
|
||||||
and <a href="https://docs.openwebui.com/">Open-WebUI</a> for LLM
|
|
||||||
services. As this is also my primary device with a few spare
|
|
||||||
terabytes of NVMe storage it contains a
|
|
||||||
<a href="https://en.wikipedia.org/wiki/Vsftpd"
|
|
||||||
>VSFTPD file server</a
|
|
||||||
>. By the way, this server runs on
|
|
||||||
<a href="https://archlinux.org/"><i>Arch Linux</i></a> :)
|
|
||||||
</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<h3>Derelict Laptop Promoted to Server</h3>
|
|
||||||
<p>
|
|
||||||
An ancient gaming laptop with significantly more computational
|
|
||||||
performance than physical durability was promoted to server,
|
|
||||||
where it runs my <a href="https://nextcloud.com/about/"
|
|
||||||
>Nextcloud</a
|
|
||||||
>
|
|
||||||
self hosted office suite. While originally this was a 'because I
|
|
||||||
can' project, I felt justified when I later saw
|
|
||||||
<a
|
|
||||||
href="https://www.digitaljournal.com/tech-science/microsoft-says-u-s-law-takes-precedence-over-canadian-data-sovereignty/article"
|
|
||||||
>Microsoft announcing USA demands come before Canadian
|
|
||||||
privacy</a
|
|
||||||
>.
|
|
||||||
</p>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="UAV" class="align-left card">
|
|
||||||
<div style="float: right; padding: 20px; width: 10vw;">
|
|
||||||
<img
|
|
||||||
src="/src/lib/drone/graphing.jpg"
|
|
||||||
style="width: 10vw;"
|
|
||||||
alt="Testing Input Response"
|
|
||||||
/>
|
|
||||||
<p class="center">Testing Input Response</p>
|
|
||||||
<img
|
|
||||||
src="/src/lib/drone/top.jpg"
|
|
||||||
style="width: 10vw;"
|
|
||||||
alt="Internal View"
|
|
||||||
/>
|
|
||||||
<p class="center">Internal View</p>
|
|
||||||
</div>
|
|
||||||
<h1>Building a UAV</h1>
|
|
||||||
<p>
|
|
||||||
I chose to build a drone from scratch for my AP Physics final project.
|
|
||||||
We were given an open ended assignment to <i>build something cool</i>
|
|
||||||
and I wanted a drone. My choice was much more ambitious than the course required,
|
|
||||||
and took quite a while to complete.<br /><br />
|
|
||||||
|
|
||||||
For the drones frame I finally had an excuse to purchase a 3d printer. I
|
|
||||||
modelled the frame and arms modularly to support future upgrades and
|
|
||||||
replacements from damage, reducing the cost of operation. Initially I
|
|
||||||
was using some 3d printed torodial propellers due to their higher
|
|
||||||
efficiency and lower sounds usage. Due to safety concerns of the
|
|
||||||
propellers not withstanding tension at higher RPMs and exploding I
|
|
||||||
switched to some generic acrylic propellers I bought. A challenge in
|
|
||||||
designing the frame was leaving enough room to contain the volume of the
|
|
||||||
wires. I went with the Elegoo Neptune 3 as the printer was open-source
|
|
||||||
and had a much better cost-to-utility than proprietary printers such as
|
|
||||||
the Ender series. I am not sponsored I just really like the printer.<br
|
|
||||||
/><br />
|
|
||||||
|
|
||||||
The flight computer was the most difficult part to program. Using an
|
|
||||||
ultrasonic distance sensor, gyroscope, and accelerometer the drone has
|
|
||||||
enough information to probably never crash. The autopilot is implemented
|
|
||||||
on an Arduino UNO using a
|
|
||||||
<a
|
|
||||||
href="https://en.wikipedia.org/wiki/Proportional%E2%80%93integral%E2%80%93derivative_controller"
|
|
||||||
>PID controller</a
|
|
||||||
>
|
|
||||||
for stabolization. The autopilot quality is currently impacted every time
|
|
||||||
the drones mass distribution changes, which can be fixed with a reinforcement
|
|
||||||
machine learning algorithm. For the higher level programming such as flight
|
|
||||||
automation, video transmission and WiFi communications I used a Raspberry
|
|
||||||
Pi Pico. There is also a 2.4GHz line of sight receiver for manual control.
|
|
||||||
A future upgrade may contain a SIM card for near-infinite remote control
|
|
||||||
connection, but drone regulations would make this difficult.<br /><br />
|
|
||||||
|
|
||||||
The power system is the most physically challenging portion of the
|
|
||||||
drone. The motors took 14.6 Volts, while the UNO microcontroller took 5
|
|
||||||
Volts, and the Pico and most sensors run at 3.3 Volts. All of the power
|
|
||||||
to the motors ran through the power distribution board, which I modified
|
|
||||||
to also output the lower voltages and used Bidirectional Logic Level
|
|
||||||
Converters to shift between 3.3 and 5V signals where needed. A potential
|
|
||||||
flaw with having all the power coming from the same source is spikes in
|
|
||||||
energy consumption to the motors may cause the microcomputers to receive
|
|
||||||
too little power, which could be fixed with a capacitor. Luckily, I
|
|
||||||
haven't experienced this yet as the 2C discharge rate on the 2.5Ah
|
|
||||||
capacity battery is more than enough. Having a battery this big does
|
|
||||||
mean it takes up about half the internal electronics volume and is half
|
|
||||||
of the drones mass, but it can also maintain full throttle for half an
|
|
||||||
hour making for long flights.<br /><br />
|
|
||||||
|
|
||||||
The motors I used were a bit overkill for a 1.1kg drone, as going past
|
|
||||||
20% throttle sends it shooting through the sky -- which is not a bad
|
|
||||||
issue to have. Here's the technical numbers behind that: I have
|
|
||||||
propellers with a 6cm radius on motors with a 2450KV rating (2450 rpm
|
|
||||||
per volt) at peaking at 14.6 Volts. From this the tip speed is computed
|
|
||||||
to be ~225m/s under no load at max throttle, quite a lot more than what
|
|
||||||
is safe or necessary to get into the air.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="Phobos" class="align-right card">
|
|
||||||
<h1>Phobos</h1>
|
|
||||||
<p>
|
|
||||||
One of the coolest things I've developed is a game, fully written in
|
|
||||||
assembly.<br /><br />
|
|
||||||
I say this because it is the perfect intersection of many things I enjoy;
|
|
||||||
low level programming, physics, space, simulation development, and game design.
|
|
||||||
Also small enough of a project that I could complete it in under a couple
|
|
||||||
of months, so another win. I even named the game based on the emulator, as
|
|
||||||
Phobos is a moon of Mars <br /><br />The instructions for this
|
|
||||||
assignment were very broad, to develop a platformer game in assembly.
|
|
||||||
This left a lot of room for creative freedom, especially due to the
|
|
||||||
loose definition of platformer. With infinite time I would have
|
|
||||||
developed a whole rocket simulator, and used the justification that the
|
|
||||||
launchpad was a platform.
|
|
||||||
<br />
|
|
||||||
<br /> On the technical side this was a very difficult project. There are
|
|
||||||
only about 16 variables actually usable in MIPS, and a lot of them are reserved
|
|
||||||
to specific logical controls under best practice. Then following the many
|
|
||||||
loops and recursive, real-time functionality required extensive and efficient
|
|
||||||
use of the stack. Ideally accessing a few bytes shouldn't strike the fear
|
|
||||||
of low framerates to mind, but the Mars-MIPS emulator I was using was far
|
|
||||||
from efficient.
|
|
||||||
</p>
|
|
||||||
<h3>Notable Features</h3>
|
|
||||||
<ul>
|
|
||||||
<li>Raycast collision detection and repositioning</li>
|
|
||||||
<li>Sub-pixel velocity and positioning</li>
|
|
||||||
<li>Awesome pixel graphics (the rocket shoots fire!)</li>
|
|
||||||
<li>High framerates (for a low-performance emulator)</li>
|
|
||||||
<li>Enemies shooting at you!</li>
|
|
||||||
<li>Loot pickups</li>
|
|
||||||
</ul>
|
|
||||||
<p>
|
|
||||||
Probably the most annoying part of this was that the emulator couldn't
|
|
||||||
handle simutaineous key inputs. Fortunately I have over a thousand hours
|
|
||||||
experience landing rockets on the <a
|
|
||||||
href="https://kerbalspaceprogram.fandom.com/wiki/Mun">Mün</a
|
|
||||||
>
|
|
||||||
so I was comfortable giving a few unique key inputs per second. I never imagined
|
|
||||||
this is something I would be proud, and I still don't think I am. However,
|
|
||||||
it works.<br /><br />At this point you may have realized I am a bit of a
|
|
||||||
space nerd. Enjoy this recording I made at 1am demonstrating the
|
|
||||||
features of my game to a TA, compressed to the point that the audio has
|
|
||||||
texture.
|
|
||||||
</p>
|
|
||||||
<video width="90%" controls>
|
|
||||||
<track kind="captions" />
|
|
||||||
<source src="src/lib/phobos/demo.mp4" type="video/mp4" />
|
|
||||||
Your browser does not support the video.
|
|
||||||
</video><br />
|
|
||||||
The
|
|
||||||
<a href="https://github.com/jjanella/Phobos">source code</a> is also available
|
|
||||||
for your enjoyment.
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="align-left card">
|
|
||||||
<h1>Work Experience</h1>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<h3>Cybersecurity Analyst for Equifax</h3>
|
|
||||||
<ul>
|
|
||||||
<li>Analyzed Security Posture, Business Risk, Compliance</li>
|
|
||||||
<li>
|
|
||||||
Supported Vulnerability Management sourced from Penetration
|
|
||||||
Tests & automated tools
|
|
||||||
</li>
|
|
||||||
<li>Handled issues, exceptions, and deviations</li>
|
|
||||||
<li>
|
|
||||||
Provided Security Advisment Services for infrastructure and
|
|
||||||
code development
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
Used automated scanning tools, GCP, AWS, shell scripts,
|
|
||||||
Linux
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<h3>Software Developer for Parkside Pool</h3>
|
|
||||||
<p>
|
|
||||||
This is a role that didn't exist before me. I was a lifeguard
|
|
||||||
and swim instructor here, and the pool I worked at was being
|
|
||||||
swamped with administrative work. Eventually I took on this work
|
|
||||||
for the money that came with it. For ten hours each week, I
|
|
||||||
would be reading emails, co-ordinating lessons, and sending out
|
|
||||||
schedules. Creating the schedules was a tedious task, with
|
|
||||||
siblings at different levels needing back to back lessons,
|
|
||||||
people not available some days or times, and other various soft
|
|
||||||
and hard requirements. <br /><br /> Soon I found out there is no
|
|
||||||
easy algorithm known for finding solutions to problems with many
|
|
||||||
soft and hard requirements. This is a NP-hard and is described
|
|
||||||
in the
|
|
||||||
<a href="https://en.wikipedia.org/wiki/Nurse_scheduling_problem"
|
|
||||||
>Nurse Scheduling Problem</a
|
|
||||||
>. Fortunately there was a cap of 128 students I could fit into
|
|
||||||
classes per week and the final algorithm was around O(n³) for n
|
|
||||||
swimmers, so the runtime wasn't horrible. <br /><br />
|
|
||||||
Implementing the reception and confirmation of lessons was straightforward
|
|
||||||
enough with a Flask site using Stripe for payments, and Firebase
|
|
||||||
service for sending confirmation emails.
|
|
||||||
</p>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="align-right card">
|
|
||||||
<h1>Volunteering</h1>
|
|
||||||
<p>
|
|
||||||
I volunteer within the Computer Science, Mathematics, and Statistics
|
|
||||||
department at the University of Toronto as a Computer Science Ambassador
|
|
||||||
to help cultivate interest in the Mathematical Sciences in high school
|
|
||||||
students, as well as providing direction for first year students within
|
|
||||||
the programs.
|
|
||||||
</p>
|
|
||||||
</div> -->
|
|
||||||
49
static/strings/gamedev.md
Normal file
49
static/strings/gamedev.md
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
I am currently developing an underground-submarine openworld multiplayer
|
||||||
|
physics inspired game. As a gamer and enjoyer of large, rich maps and
|
||||||
|
depth to gameplay, I would really like to say thats what I started out
|
||||||
|
trying to create. Instead, the story goes that I had this random idea
|
||||||
|
for terrain manipulation. Games like Minecraft and Terraria use squares
|
||||||
|
and cubes, which just feels boring in my opinion. I thought I could do
|
||||||
|
something much more <i>visceral</i> As a sort of tech-demo/proof of
|
||||||
|
concept I programmed a shape that could be modified by boolean geometry
|
||||||
|
operations, mainly union and subtract with a second polygon. This led to
|
||||||
|
a very interesting, but quickly boring "game" to hop around in. However,
|
||||||
|
since I could drill through and place prettymuch any shape I wanted to,
|
||||||
|
it felt like I could "fly" through the land, much like a submarine
|
||||||
|
"flies" through water.<br /><br />I implemented some modularly built
|
||||||
|
vehicles with use of graphs theory and object oriented programming, and
|
||||||
|
terrain generation using cellular noise. The reason I used cellular
|
||||||
|
noise is because if you look at the lines between cells, they form a
|
||||||
|
network without dead ends. Then by applying an algorithm using a density
|
||||||
|
function on depth I am able to fine tune the width and density of the
|
||||||
|
caves without impacting their interconnectedness. By using this method
|
||||||
|
chunks can generate completely independent of their neighbor, which is
|
||||||
|
optimal.<br /><br />"Multiplayer is the hardest part of game dev, maybe
|
||||||
|
release that later" I have been told by a lot of people. However, as a
|
||||||
|
hobby-server configurer and network security nerd, I thought I could
|
||||||
|
take it on. I was right, however as a network security nerd I have more
|
||||||
|
layers of firewalls than I do braincells. Every single time I have an
|
||||||
|
issue with networking, its a firewall. Once I found which ports were
|
||||||
|
blocked, yes multiplayer was easy.<br /><br />The result? I could fly
|
||||||
|
drilling vehicles through terrain, pop out of the ground or into random
|
||||||
|
caves, mine materials, play hide and seek with friends, and even orbit
|
||||||
|
the planet. One of the things important to me in this game was accurate
|
||||||
|
physics: thrust, torque, gravity, mass, all the fun stuff. While I am a
|
||||||
|
physics minor, I am more importantly a heavy player of physics and
|
||||||
|
rocket science games such as Kerbal Space Program. I was able to glide
|
||||||
|
through AP physics simply because it
|
||||||
|
<i>just part of the games world</i>, it included everything we would
|
||||||
|
learn in the classroom. Realistic physics also added to the depth of
|
||||||
|
gameplay I was looking for.<br /><br /> After some formal computer
|
||||||
|
science education, I discovered new ways to more efficiently implement
|
||||||
|
many of the algorithms I had initially generated and rewrote them
|
||||||
|
...multiple times. Currently everything runs <i>buttery smooth</i> and
|
||||||
|
framerates are high due to efficient caching of unloaded chunks,
|
||||||
|
multithreaded chunk generation, gpu accelerated compute shaders to
|
||||||
|
modify chunk density, enhanced use of object oriented programing and
|
||||||
|
graph algorithms to build massive modular vehicles, authoritative server
|
||||||
|
networking to disable hackers, and other performance tweaks.<br /><br />
|
||||||
|
So this sounds amazing, where's the game? Well, a game needs graphics, audio,
|
||||||
|
a sound track. As much as I'd love to release it now, its unplayable for
|
||||||
|
these reasons along with a few minor implementations left such as NPC's and
|
||||||
|
reworking the tech tree.
|
||||||
5
static/strings/home.md
Normal file
5
static/strings/home.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
|
||||||
|
# About me
|
||||||
|
I'm a fungi
|
||||||
|
|
||||||
|
_markdown in html :0_
|
||||||
64
static/strings/network.md
Normal file
64
static/strings/network.md
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
<h1>Servers & Networking</h1>
|
||||||
|
<p>
|
||||||
|
Open source and networking hobbies led me to depoly a set of
|
||||||
|
interconnected Linux servers:
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<h3>NGINX Reverse Proxy and VPN Server</h3>
|
||||||
|
<p>
|
||||||
|
This server is the internets access to all of my other servers,
|
||||||
|
and the glue holding them together. I was using IPTables briefly
|
||||||
|
but have moved to NGINX to forward traffic from specified ports
|
||||||
|
onto private servers connected to it. This device doubles as a <a
|
||||||
|
href="https://www.wireguard.com/">Wireguard VPN</a
|
||||||
|
> server which in the past connected servers on the same virtual
|
||||||
|
network, however I have switched to reverse ssh tunnels to connect
|
||||||
|
other servers to this one. The VPN is still useful for odd networking
|
||||||
|
tasks and troubleshooting.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h3>Lightweight Server</h3>
|
||||||
|
<p>
|
||||||
|
Running on Raspberry Pi, this servers main job is to run
|
||||||
|
Subterstrike servers, Minecraft servers, other game servers, and
|
||||||
|
this website you're looking at.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h3>AI & FTP Server</h3>
|
||||||
|
<p>
|
||||||
|
A powerful computer with an RX 6950 XT GPU runs my local
|
||||||
|
generative AI servers including <a
|
||||||
|
href="https://invoke-ai.github.io/InvokeAI/">Invoke AI</a
|
||||||
|
>
|
||||||
|
for Image Generation,
|
||||||
|
<a href="https://ollama.com/?ref=useaiforit">Ollama</a>
|
||||||
|
and <a href="https://docs.openwebui.com/">Open-WebUI</a> for LLM
|
||||||
|
services. As this is also my primary device with a few spare
|
||||||
|
terabytes of NVMe storage it contains a
|
||||||
|
<a href="https://en.wikipedia.org/wiki/Vsftpd"
|
||||||
|
>VSFTPD file server</a
|
||||||
|
>. By the way, this server runs on
|
||||||
|
<a href="https://archlinux.org/"><i>Arch Linux</i></a> :)
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h3>Derelict Laptop Promoted to Server</h3>
|
||||||
|
<p>
|
||||||
|
An ancient gaming laptop with significantly more computational
|
||||||
|
performance than physical durability was promoted to server,
|
||||||
|
where it runs my <a href="https://nextcloud.com/about/"
|
||||||
|
>Nextcloud</a
|
||||||
|
>
|
||||||
|
self hosted office suite. While originally this was a 'because I
|
||||||
|
can' project, I felt justified when I later saw
|
||||||
|
<a
|
||||||
|
href="https://www.digitaljournal.com/tech-science/microsoft-says-u-s-law-takes-precedence-over-canadian-data-sovereignty/article"
|
||||||
|
>Microsoft announcing USA demands come before Canadian
|
||||||
|
privacy</a
|
||||||
|
>.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
53
static/strings/phobos.md
Normal file
53
static/strings/phobos.md
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
<h1>Phobos</h1>
|
||||||
|
<p>
|
||||||
|
One of the coolest things I've developed is a game, fully written in
|
||||||
|
assembly.<br /><br />
|
||||||
|
I say this because it is the perfect intersection of many things I enjoy;
|
||||||
|
low level programming, physics, space, simulation development, and game design.
|
||||||
|
Also small enough of a project that I could complete it in under a couple
|
||||||
|
of months, so another win. I even named the game based on the emulator, as
|
||||||
|
Phobos is a moon of Mars <br /><br />The instructions for this
|
||||||
|
assignment were very broad, to develop a platformer game in assembly.
|
||||||
|
This left a lot of room for creative freedom, especially due to the
|
||||||
|
loose definition of platformer. With infinite time I would have
|
||||||
|
developed a whole rocket simulator, and used the justification that the
|
||||||
|
launchpad was a platform.
|
||||||
|
<br />
|
||||||
|
<br /> On the technical side this was a very difficult project. There are
|
||||||
|
only about 16 variables actually usable in MIPS, and a lot of them are reserved
|
||||||
|
to specific logical controls under best practice. Then following the many
|
||||||
|
loops and recursive, real-time functionality required extensive and efficient
|
||||||
|
use of the stack. Ideally accessing a few bytes shouldn't strike the fear
|
||||||
|
of low framerates to mind, but the Mars-MIPS emulator I was using was far
|
||||||
|
from efficient.
|
||||||
|
</p>
|
||||||
|
<h3>Notable Features</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Raycast collision detection and repositioning</li>
|
||||||
|
<li>Sub-pixel velocity and positioning</li>
|
||||||
|
<li>Awesome pixel graphics (the rocket shoots fire!)</li>
|
||||||
|
<li>High framerates (for a low-performance emulator)</li>
|
||||||
|
<li>Enemies shooting at you!</li>
|
||||||
|
<li>Loot pickups</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
Probably the most annoying part of this was that the emulator couldn't
|
||||||
|
handle simutaineous key inputs. Fortunately I have over a thousand hours
|
||||||
|
experience landing rockets on the <a
|
||||||
|
href="https://kerbalspaceprogram.fandom.com/wiki/Mun">Mün</a
|
||||||
|
>
|
||||||
|
so I was comfortable giving a few unique key inputs per second. I never imagined
|
||||||
|
this is something I would be proud, and I still don't think I am. However,
|
||||||
|
it works.<br /><br />At this point you may have realized I am a bit of a
|
||||||
|
space nerd. Enjoy this recording I made at 1am demonstrating the
|
||||||
|
features of my game to a TA, compressed to the point that the audio has
|
||||||
|
texture.
|
||||||
|
</p>
|
||||||
|
<video width="90%" controls>
|
||||||
|
<track kind="captions" />
|
||||||
|
<source src="src/lib/phobos/demo.mp4" type="video/mp4" />
|
||||||
|
Your browser does not support the video.
|
||||||
|
</video><br />
|
||||||
|
The
|
||||||
|
<a href="https://github.com/jjanella/Phobos">source code</a> is also available
|
||||||
|
for your enjoyment.
|
||||||
59
static/strings/uav.md
Normal file
59
static/strings/uav.md
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
<h1>Building a UAV</h1>
|
||||||
|
<p>
|
||||||
|
I chose to build a drone from scratch for my AP Physics final project.
|
||||||
|
We were given an open ended assignment to <i>build something cool</i>
|
||||||
|
and I wanted a drone. My choice was much more ambitious than the course required,
|
||||||
|
and took quite a while to complete.<br /><br />
|
||||||
|
|
||||||
|
For the drones frame I finally had an excuse to purchase a 3d printer. I
|
||||||
|
modelled the frame and arms modularly to support future upgrades and
|
||||||
|
replacements from damage, reducing the cost of operation. Initially I
|
||||||
|
was using some 3d printed torodial propellers due to their higher
|
||||||
|
efficiency and lower sounds usage. Due to safety concerns of the
|
||||||
|
propellers not withstanding tension at higher RPMs and exploding I
|
||||||
|
switched to some generic acrylic propellers I bought. A challenge in
|
||||||
|
designing the frame was leaving enough room to contain the volume of the
|
||||||
|
wires. I went with the Elegoo Neptune 3 as the printer was open-source
|
||||||
|
and had a much better cost-to-utility than proprietary printers such as
|
||||||
|
the Ender series. I am not sponsored I just really like the printer.<br
|
||||||
|
/><br />
|
||||||
|
|
||||||
|
The flight computer was the most difficult part to program. Using an
|
||||||
|
ultrasonic distance sensor, gyroscope, and accelerometer the drone has
|
||||||
|
enough information to probably never crash. The autopilot is implemented
|
||||||
|
on an Arduino UNO using a
|
||||||
|
<a
|
||||||
|
href="https://en.wikipedia.org/wiki/Proportional%E2%80%93integral%E2%80%93derivative_controller"
|
||||||
|
>PID controller</a
|
||||||
|
>
|
||||||
|
for stabolization. The autopilot quality is currently impacted every time
|
||||||
|
the drones mass distribution changes, which can be fixed with a reinforcement
|
||||||
|
machine learning algorithm. For the higher level programming such as flight
|
||||||
|
automation, video transmission and WiFi communications I used a Raspberry
|
||||||
|
Pi Pico. There is also a 2.4GHz line of sight receiver for manual control.
|
||||||
|
A future upgrade may contain a SIM card for near-infinite remote control
|
||||||
|
connection, but drone regulations would make this difficult.<br /><br />
|
||||||
|
|
||||||
|
The power system is the most physically challenging portion of the
|
||||||
|
drone. The motors took 14.6 Volts, while the UNO microcontroller took 5
|
||||||
|
Volts, and the Pico and most sensors run at 3.3 Volts. All of the power
|
||||||
|
to the motors ran through the power distribution board, which I modified
|
||||||
|
to also output the lower voltages and used Bidirectional Logic Level
|
||||||
|
Converters to shift between 3.3 and 5V signals where needed. A potential
|
||||||
|
flaw with having all the power coming from the same source is spikes in
|
||||||
|
energy consumption to the motors may cause the microcomputers to receive
|
||||||
|
too little power, which could be fixed with a capacitor. Luckily, I
|
||||||
|
haven't experienced this yet as the 2C discharge rate on the 2.5Ah
|
||||||
|
capacity battery is more than enough. Having a battery this big does
|
||||||
|
mean it takes up about half the internal electronics volume and is half
|
||||||
|
of the drones mass, but it can also maintain full throttle for half an
|
||||||
|
hour making for long flights.<br /><br />
|
||||||
|
|
||||||
|
The motors I used were a bit overkill for a 1.1kg drone, as going past
|
||||||
|
20% throttle sends it shooting through the sky -- which is not a bad
|
||||||
|
issue to have. Here's the technical numbers behind that: I have
|
||||||
|
propellers with a 6cm radius on motors with a 2450KV rating (2450 rpm
|
||||||
|
per volt) at peaking at 14.6 Volts. From this the tip speed is computed
|
||||||
|
to be ~225m/s under no load at max throttle, quite a lot more than what
|
||||||
|
is safe or necessary to get into the air.
|
||||||
|
</p>
|
||||||
58
static/strings/work-history.md
Normal file
58
static/strings/work-history.md
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
<h1>Work Experience</h1>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<h3>Cybersecurity Analyst for Equifax</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Analyzed Security Posture, Business Risk, Compliance</li>
|
||||||
|
<li>
|
||||||
|
Supported Vulnerability Management sourced from Penetration
|
||||||
|
Tests & automated tools
|
||||||
|
</li>
|
||||||
|
<li>Handled issues, exceptions, and deviations</li>
|
||||||
|
<li>
|
||||||
|
Provided Security Advisment Services for infrastructure and
|
||||||
|
code development
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Used automated scanning tools, GCP, AWS, shell scripts,
|
||||||
|
Linux
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h3>Software Developer for Parkside Pool</h3>
|
||||||
|
<p>
|
||||||
|
This is a role that didn't exist before me. I was a lifeguard
|
||||||
|
and swim instructor here, and the pool I worked at was being
|
||||||
|
swamped with administrative work. Eventually I took on this work
|
||||||
|
for the money that came with it. For ten hours each week, I
|
||||||
|
would be reading emails, co-ordinating lessons, and sending out
|
||||||
|
schedules. Creating the schedules was a tedious task, with
|
||||||
|
siblings at different levels needing back to back lessons,
|
||||||
|
people not available some days or times, and other various soft
|
||||||
|
and hard requirements. <br /><br /> Soon I found out there is no
|
||||||
|
easy algorithm known for finding solutions to problems with many
|
||||||
|
soft and hard requirements. This is a NP-hard and is described
|
||||||
|
in the
|
||||||
|
<a href="https://en.wikipedia.org/wiki/Nurse_scheduling_problem"
|
||||||
|
>Nurse Scheduling Problem</a
|
||||||
|
>. Fortunately there was a cap of 128 students I could fit into
|
||||||
|
classes per week and the final algorithm was around O(n³) for n
|
||||||
|
swimmers, so the runtime wasn't horrible. <br /><br />
|
||||||
|
Implementing the reception and confirmation of lessons was straightforward
|
||||||
|
enough with a Flask site using Stripe for payments, and Firebase
|
||||||
|
service for sending confirmation emails.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="align-right card">
|
||||||
|
<h1>Volunteering</h1>
|
||||||
|
<p>
|
||||||
|
I volunteer within the Computer Science, Mathematics, and Statistics
|
||||||
|
department at the University of Toronto as a Computer Science Ambassador
|
||||||
|
to help cultivate interest in the Mathematical Sciences in high school
|
||||||
|
students, as well as providing direction for first year students within
|
||||||
|
the programs.
|
||||||
|
</p>
|
||||||
@@ -6,10 +6,15 @@
|
|||||||
font-display: swap; /* Shows fallback font until custom font loads */
|
font-display: swap; /* Shows fallback font until custom font loads */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
color: whitesmoke;
|
||||||
|
font-family: sans-serif;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
header {
|
header {
|
||||||
background-color: transparent; /* Light grey background */
|
background-color: transparent;
|
||||||
border-bottom: 1px solid #ddd;
|
border-bottom: 1px solid whitesmoke;
|
||||||
padding: 1rem 1rem;
|
padding: 1rem 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -22,38 +27,36 @@ nav {
|
|||||||
}
|
}
|
||||||
|
|
||||||
nav ul {
|
nav ul {
|
||||||
list-style: none; /* Removes bullet points */
|
list-style: none;
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 20px; /* Space between links */
|
gap: 20px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#name {
|
#name {
|
||||||
font-size: 3rem;
|
text-align: center;
|
||||||
margin: 20px;
|
font-size: 5rem;
|
||||||
padding: 0px;
|
margin: 20px;
|
||||||
text-shadow:
|
padding: 0px;
|
||||||
1px 1px orangered,
|
animation: nameShadow 5s linear infinite;
|
||||||
2px 2px yellow,
|
letter-spacing: 2px;
|
||||||
3px 3px green,
|
color: whitesmoke;
|
||||||
4px 4px cornflowerblue;
|
font-family: "Ethnocentric", sans-serif;
|
||||||
letter-spacing: 2px;
|
transform: skewX(-20deg);
|
||||||
width: fit-content;
|
|
||||||
color: whitesmoke;
|
|
||||||
font-family: "Ethnocentric", sans-serif;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nav a {
|
@keyframes nameShadow {
|
||||||
text-decoration: none;
|
0% {
|
||||||
color: #333;
|
text-shadow: none;
|
||||||
font-family: sans-serif;
|
}
|
||||||
}
|
90% {
|
||||||
|
text-shadow:
|
||||||
nav a:hover {
|
-6px -3px cornflowerblue,
|
||||||
color: #007bff; /* Changes color when you hover */
|
6px 3px orangered;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
background-color: #111;
|
background-image: linear-gradient(315deg, #111, #222);
|
||||||
}
|
}
|
||||||
|
|||||||
27
templates/home.html
Normal file
27
templates/home.html
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" href="/static/style.css"
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<nav>
|
||||||
|
<ul>
|
||||||
|
<li>Posts</li>
|
||||||
|
<li>Contact</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<div style="padding: auto">
|
||||||
|
<div>
|
||||||
|
<p id="name">Jeremy Janella</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{{ content|safe }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user