Initial commit
Some checks failed
ci/woodpecker/manual/woodpecker Pipeline failed

This commit is contained in:
Isaac Mills 2024-03-18 18:21:35 -04:00
commit e892c2f8a3
Signed by: fnmain
GPG key ID: B67D7410F33A0F61
78 changed files with 6070 additions and 0 deletions

6
.cargo/config.toml Normal file
View file

@ -0,0 +1,6 @@
# clipboard api is still unstable, so web-sys requires the below flag to be passed for copy (ctrl + c) to work
# https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html
# check status at https://developer.mozilla.org/en-US/docs/Web/API/Clipboard#browser_compatibility
# we don't use `[build]` because of rust analyzer's build cache invalidation https://github.com/emilk/eframe_template/issues/93
[target.wasm32-unknown-unknown]
rustflags = ["--cfg=web_sys_unstable_apis"]

1
.gitattributes vendored Normal file
View file

@ -0,0 +1 @@
assets/ filter=lfs diff=lfs merge=lfs -text

45
.github/workflows/pages.yml vendored Normal file
View file

@ -0,0 +1,45 @@
name: Github Pages
# By default, runs if you push to master. keeps your deployed app in sync with master branch.
on:
push:
branches:
- master
# to only run when you do a new github release, comment out above part and uncomment the below trigger.
# on:
# release:
# types:
# - published
permissions:
contents: write # for committing to gh-pages branch.
jobs:
build-github-pages:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2 # repo checkout
- uses: actions-rs/toolchain@v1 # get rust toolchain for wasm
with:
profile: minimal
toolchain: stable
target: wasm32-unknown-unknown
override: true
- name: Rust Cache # cache the rust build artefacts
uses: Swatinem/rust-cache@v1
- name: Download and install Trunk binary
run: wget -qO- https://github.com/thedodd/trunk/releases/latest/download/trunk-x86_64-unknown-linux-gnu.tar.gz | tar -xzf-
- name: Build # build
# "${GITHUB_REPOSITORY#*/}" evaluates into the name of the repository
# using --public-url something will allow trunk to modify all the href paths like from favicon.ico to repo_name/favicon.ico .
# this is necessary for github pages where the site is deployed to username.github.io/repo_name and all files must be requested
# relatively as eframe_template/favicon.ico. if we skip public-url option, the href paths will instead request username.github.io/favicon.ico which
# will obviously return error 404 not found.
run: ./trunk build --release --public-url "${GITHUB_REPOSITORY#*/}"
- name: Deploy
uses: JamesIves/github-pages-deploy-action@v4
with:
folder: dist
# this option will not maintain any history of your previous pages deployment
# set to false if you want all page build to be committed to your gh-pages branch history
single-commit: true

105
.github/workflows/rust.yml vendored Normal file
View file

@ -0,0 +1,105 @@
on: [push, pull_request]
name: CI
env:
# This is required to enable the web_sys clipboard API which egui_web uses
# https://rustwasm.github.io/wasm-bindgen/api/web_sys/struct.Clipboard.html
# https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html
RUSTFLAGS: --cfg=web_sys_unstable_apis
jobs:
check:
name: Check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
- uses: actions-rs/cargo@v1
with:
command: check
args: --all-features
check_wasm:
name: Check wasm32
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
target: wasm32-unknown-unknown
override: true
- uses: actions-rs/cargo@v1
with:
command: check
args: --all-features --lib --target wasm32-unknown-unknown
test:
name: Test Suite
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
- run: sudo apt-get install libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev libssl-dev
- uses: actions-rs/cargo@v1
with:
command: test
args: --lib
fmt:
name: Rustfmt
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
components: rustfmt
- uses: actions-rs/cargo@v1
with:
command: fmt
args: --all -- --check
clippy:
name: Clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
components: clippy
- uses: actions-rs/cargo@v1
with:
command: clippy
args: -- -D warnings
trunk:
name: trunk
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: 1.72.0
target: wasm32-unknown-unknown
override: true
- name: Download and install Trunk binary
run: wget -qO- https://github.com/thedodd/trunk/releases/latest/download/trunk-x86_64-unknown-linux-gnu.tar.gz | tar -xzf-
- name: Build
run: ./trunk build

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
/target
/dist

17
.woodpecker.yml Normal file
View file

@ -0,0 +1,17 @@
steps:
- name: build
image: rust
commands:
- wget https://github.com/mozilla/sccache/releases/download/v0.7.7/sccache-v0.7.7-x86_64-unknown-linux-musl.tar.gz
- tar xzf sccache-v0.7.7-x86_64-unknown-linux-musl.tar.gz
- mv sccache-v0.7.7-x86_64-unknown-linux-musl/sccache /usr/bin/sccache
- chmod +x /usr/bin/sccache
- sccache --start-server
- sccache --show-stats
- curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash
- cargo binstall trunk
- trunk build --release -- --target-dir /var/woodpecker/portfolio-build
- rm -rf /var/woodpecker/portfolio
- mv dist /var/woodpecker/portfolio
volumes:
- /var/woodpecker:/var/woodpecker

4225
Cargo.lock generated Normal file

File diff suppressed because it is too large Load diff

61
Cargo.toml Normal file
View file

@ -0,0 +1,61 @@
[package]
name = "portfolio"
version = "0.1.0"
authors = ["Isaac Mills <rooster0055@protonmail.com>"]
edition = "2021"
rust-version = "1.72"
[dependencies]
cosmic-jotdown = { version = "0.1.0", path = "../cosmic-jotdown" }
eframe = { version = "0.26.2", default-features = false, features = [
"accesskit", # Make egui comptaible with screen readers. NOTE: adds a lot of dependencies.
# "default_fonts",
"wgpu", # Use the glow rendering backend. Alternative: "wgpu".
"x11",
"wayland",
] }
egui-glyphon = { version = "0.1.0", path = "../egui-glyphon" }
egui_extras = { version = "0.26.2", features = ["image", "http", "file"] }
encase = { version = "0.7.0", features = ["glam"] }
glam = "0.25.0"
image = { version = "0.24.9", features = ["jpeg", "png"] }
keyframe = { version = "1.1.1", default-features = false }
log = "0.4"
range-map = "0.2.0"
# native:
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
env_logger = "0.10"
# web:
[target.'cfg(target_arch = "wasm32")'.dependencies]
wgpu = { version = "0.19.3", features = ["webgpu", "webgl"] }
wasm-bindgen-futures = "0.4"
[profile.release]
opt-level = 2 # fast and small wasm
lto = true
panic = "abort"
strip = true
# Optimize all dependencies even in debug builds:
[profile.dev.package."*"]
opt-level = 2
[patch.crates-io]
[build-dependencies]
databake = "0.1.7"
glob = "0.3.1"
jotdown = { version = "0.3.2", path = "../jotdown", features = ["parser"] }
# If you want to use the bleeding edge version of egui and eframe:
# egui = { git = "https://github.com/emilk/egui", branch = "master" }
# eframe = { git = "https://github.com/emilk/egui", branch = "master" }
# If you fork https://github.com/emilk/egui you can test with:
# egui = { path = "../egui/crates/egui" }
# eframe = { path = "../egui/crates/eframe" }

76
README.md Normal file
View file

@ -0,0 +1,76 @@
# eframe template
[![dependency status](https://deps.rs/repo/github/emilk/eframe_template/status.svg)](https://deps.rs/repo/github/emilk/eframe_template)
[![Build Status](https://github.com/emilk/eframe_template/workflows/CI/badge.svg)](https://github.com/emilk/eframe_template/actions?workflow=CI)
This is a template repo for [eframe](https://github.com/emilk/egui/tree/master/crates/eframe), a framework for writing apps using [egui](https://github.com/emilk/egui/).
The goal is for this to be the simplest way to get started writing a GUI app in Rust.
You can compile your app natively or for the web, and share it using Github Pages.
## Getting started
Start by clicking "Use this template" at https://github.com/emilk/eframe_template/ or follow [these instructions](https://docs.github.com/en/free-pro-team@latest/github/creating-cloning-and-archiving-repositories/creating-a-repository-from-a-template).
Change the name of the crate: Chose a good name for your project, and change the name to it in:
* `Cargo.toml`
* Change the `package.name` from `eframe_template` to `your_crate`.
* Change the `package.authors`
* `main.rs`
* Change `eframe_template::TemplateApp` to `your_crate::TemplateApp`
* `index.html`
* Change the `<title>eframe template</title>` to `<title>your_crate</title>`. optional.
* `assets/sw.js`
* Change the `'./eframe_template.js'` to `./your_crate.js` (in `filesToCache` array)
* Change the `'./eframe_template_bg.wasm'` to `./your_crate_bg.wasm` (in `filesToCache` array)
### Learning about egui
`src/app.rs` contains a simple example app. This is just to give some inspiration - most of it can be removed if you like.
The official egui docs are at <https://docs.rs/egui>. If you prefer watching a video introduction, check out <https://www.youtube.com/watch?v=NtUkr_z7l84>. For inspiration, check out the [the egui web demo](https://emilk.github.io/egui/index.html) and follow the links in it to its source code.
### Testing locally
Make sure you are using the latest version of stable rust by running `rustup update`.
`cargo run --release`
On Linux you need to first run:
`sudo apt-get install libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev libssl-dev`
On Fedora Rawhide you need to run:
`dnf install clang clang-devel clang-tools-extra libxkbcommon-devel pkg-config openssl-devel libxcb-devel gtk3-devel atk fontconfig-devel`
### Web Locally
You can compile your app to [WASM](https://en.wikipedia.org/wiki/WebAssembly) and publish it as a web page.
We use [Trunk](https://trunkrs.dev/) to build for web target.
1. Install the required target with `rustup target add wasm32-unknown-unknown`.
2. Install Trunk with `cargo install --locked trunk`.
3. Run `trunk serve` to build and serve on `http://127.0.0.1:8080`. Trunk will rebuild automatically if you edit the project.
4. Open `http://127.0.0.1:8080/index.html#dev` in a browser. See the warning below.
> `assets/sw.js` script will try to cache our app, and loads the cached version when it cannot connect to server allowing your app to work offline (like PWA).
> appending `#dev` to `index.html` will skip this caching, allowing us to load the latest builds during development.
### Web Deploy
1. Just run `trunk build --release`.
2. It will generate a `dist` directory as a "static html" website
3. Upload the `dist` directory to any of the numerous free hosting websites including [GitHub Pages](https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site).
4. we already provide a workflow that auto-deploys our app to GitHub pages if you enable it.
> To enable Github Pages, you need to go to Repository -> Settings -> Pages -> Source -> set to `gh-pages` branch and `/` (root).
>
> If `gh-pages` is not available in `Source`, just create and push a branch called `gh-pages` and it should be available.
You can test the template app at <https://emilk.github.io/eframe_template/>.
## Updating egui
As of 2023, egui is in active development with frequent releases with breaking changes. [eframe_template](https://github.com/emilk/eframe_template/) will be updated in lock-step to always use the latest version of egui.
When updating `egui` and `eframe` it is recommended you do so one version at the time, and read about the changes in [the egui changelog](https://github.com/emilk/egui/blob/master/CHANGELOG.md) and [eframe changelog](https://github.com/emilk/egui/blob/master/crates/eframe/CHANGELOG.md).

1
Trunk.toml Normal file
View file

@ -0,0 +1 @@
[build]

BIN
assets/favicon.ico Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
assets/icon-1024.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 KiB

BIN
assets/icon-256.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
assets/images/artix.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

BIN
assets/images/bitogo.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
assets/images/chicanery.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
assets/images/doggo.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
assets/images/dotfiles.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
assets/images/gimp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5 KiB

BIN
assets/images/hiking.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
assets/images/inkscape.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6 KiB

BIN
assets/images/java.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
assets/images/kdenlive.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
assets/images/linux.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

BIN
assets/images/me.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

BIN
assets/images/mta.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
assets/images/neumont.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
assets/images/nice_beat.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
assets/images/pac1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

BIN
assets/images/python.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
assets/images/reaper.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

BIN
assets/images/rovio.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
assets/images/rust.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
assets/images/scratch.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

23
build.rs Normal file
View file

@ -0,0 +1,23 @@
use std::{borrow::Cow, path::Path};
use databake::Bake;
use jotdown::Event;
fn main() {
let out = std::env::var("OUT_DIR").unwrap();
let jots = glob::glob("src/*.jot").unwrap();
for path in jots.map(|p| p.unwrap()) {
let file = std::fs::read_to_string(&path).unwrap();
let name = path.file_name().unwrap();
let jot: Cow<'_, [Event<'_>]> = Cow::Owned(jotdown::Parser::new(&file).collect::<Vec<_>>());
std::fs::write(
Path::new(&out).join(name),
jot.bake(&Default::default()).to_string(),
)
.unwrap();
}
}

View file

@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDStvYGRPeqk766
ySSzJ1SvQOi4I689ukgKT/TxbX4rdCBSmeERXoIt4qb8eHFz4BHPtrkDta/mTFJ2
R2knMaSHHcSwh/eJKN6lcTCN+qpnKLm3i2yKFKcXcHiqJg2tCbGj00kIkGPB4iBV
lpMF107xuukCRJAInqau6evseOITT4aXlTx/A7YJP3z3Y1qPfvAgN4ej4TDo6DtG
DSEJpsyjtC5thcCnF4vkAoIhpIbH1iNryxj1Hc75lfxdeQztUeJLjGQixLfOWjY1
EuSHjhbB3eFXQ447AOdnohohMEuurbBNfX7FvoYsLMuG4dhHPLV8HXhk/YsnrH18
ai4qBzbZAgMBAAECggEAK5+1T5b3r1jnI8SA1JZP8fh+NaEtppnqUDg9fb4tYNGp
32/8KJxoVxeVeq90zYiWJ2qs4xe6UvN6HwKpwnOEnHSNQ/7iQIM1lQraAorivHix
+k3jKrMb5L5kPNWj/y8Cl+gmNp+uB3XJO+7wgUUSEvmfQ9jt+Nrfp1bGgS6Fn3l3
DP8tq0/bRuDxfkhLOuZzXAGqXATjEDR5jfJmqoPucLjdVe9C8hXOPu2+xBiJY244
df90qjkDNiGLFBL7WsctNTy0tJaRmF+qHfXhvj2eY6fvYlXA3m2rbH5wmTaBRD7G
l6g3GCRJF7mhP2ownbcA8yzMv9DYgiH7EiclrncQAQKBgQD2heLaAT5rtgYIVkgX
OczqOwqg8Vf9z+PzA3bQ9UZybyojY/uVsy3Y1f04gQq5sdygnHE2Qr2pYpBs7gqt
yN9aNTY8NpZulRUvpRnVQqPWVIlI0xBcaDqSK7BIwnU50pLze56/u+BrJSHARFWL
SvrLAr9D2Mx57ET3RTSc72/FHQKBgQDa0KxymGIlq3JaroG5nTX6+x5KXR2+xnWb
iQDKtC0qHg/Qy7eVy5jJm2EazNchsLLybbE7RNWhE+nDjkKb3SeDUyFwpyNNKw6j
lp1KqcHcx8b0GKGf7uC2jUSW9iTVlNu9mqW2lDgLZ5h1p8QmMdl8/8AEnIn3g/YR
TrbtzV637QKBgB6dlAW0/9aKnYcth/hycjNor7I7Js1boxiMBpZ+z4forFgG07jM
rtXuBWueAwH6x8aehyTQ9xLxLbSJf4QDnVFrqFekA9yp4R6wp1un0gcNKpuDstV3
EEcU6+itVbefoiZg5N806vMDgoSJOAJ7hlft+GjppMNDh3EaBCW1SrE1AoGAboSJ
JRQcNmSCzJRpRyPFWO+u2+ZuGKZKTnWDJd6dFTG70TyjjBAaKnHFOPEPE6AYseN/
aa0ZrVLOdgwLTogD5gt9z1VLujUuHqf65/QXy3hH34/1Sj8v1mRBqXHHJu0Zk4lh
e3cfW3tGgN5sbtIsxDq0dF/QO2i2RwWX1UIuPf0CgYAbh59OslAq2Y4+8B/Ss45p
3H7fBeRAlN65X+YjkwdZi0zy5Hlczp38hurTjYlvc/vSXSUDeeAVWxQIUnFT/qQu
UyDvwzVWnx1V3EV53NsYzMP0rYV/2EYVkcJCn5RtSyDcYOFiDaxtY1liTpCjvzJz
m5blo7Angaths0lBj/sLAQ==
-----END PRIVATE KEY-----

24
certs/192.168.1.44.pem Normal file
View file

@ -0,0 +1,24 @@
-----BEGIN CERTIFICATE-----
MIIECDCCAnCgAwIBAgIRAK1O4JEC2N5FRJYJwsqP7nYwDQYJKoZIhvcNAQELBQAw
XzEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMRowGAYDVQQLDBFpc2Fh
Y21AQUNFUkxhcHRvcDEhMB8GA1UEAwwYbWtjZXJ0IGlzYWFjbUBBQ0VSTGFwdG9w
MB4XDTI0MDMxNzIzMjkzMVoXDTI2MDYxNzIzMjkzMVowRTEnMCUGA1UEChMebWtj
ZXJ0IGRldmVsb3BtZW50IGNlcnRpZmljYXRlMRowGAYDVQQLDBFpc2FhY21AQUNF
UkxhcHRvcDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANK29gZE96qT
vrrJJLMnVK9A6Lgjrz26SApP9PFtfit0IFKZ4RFegi3ipvx4cXPgEc+2uQO1r+ZM
UnZHaScxpIcdxLCH94ko3qVxMI36qmcoubeLbIoUpxdweKomDa0JsaPTSQiQY8Hi
IFWWkwXXTvG66QJEkAiepq7p6+x44hNPhpeVPH8Dtgk/fPdjWo9+8CA3h6PhMOjo
O0YNIQmmzKO0Lm2FwKcXi+QCgiGkhsfWI2vLGPUdzvmV/F15DO1R4kuMZCLEt85a
NjUS5IeOFsHd4VdDjjsA52eiGiEwS66tsE19fsW+hiwsy4bh2Ec8tXwdeGT9iyes
fXxqLioHNtkCAwEAAaNZMFcwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsG
AQUFBwMBMB8GA1UdIwQYMBaAFHvuXKJyKje/MuhO/0EpQEactUBbMA8GA1UdEQQI
MAaHBMCoASwwDQYJKoZIhvcNAQELBQADggGBAGrQiTUghaQwb5XenFdt7/pfK4Xp
vSt0g+dP/9EKkrjM4FB0qeOnjM6bcMs37NhoJwmpn+d52Y1gbjMXBgg6ZCm4ZuR4
pPQgmmiiv0/DSNwjjVpNJy+qy8iW2xujY+Mca6f8ww6XHx4mqALe113hKUMcKgk0
WwraLNk+RSZQYDUxad497V3DNXEsn9Zj3k/4hKXHNf2u2MKPqSiP4XAoEC01DtYl
LwLwx/2pyw3QBoZdskxYbCu0gEW1elTZTEmCrCo1Va8tcUOqrpdFlXQpyfIDDClI
IFlArcGG6Ya7ZAoe6TJQdSh/fh4zsf4ryxDWHOroy+UG4Nh6lQ3fezH+TkLvL4nD
nf1Zm+zLnwKiKfW7Y30OZhA/B7cxSFYd0pcnjNDzoi6/x4ONL9wjadxa7qTaJgxW
hzJZli+Efh1hFPJJDCOU/eSJ0+aVRkblca8ns9GvSD1LChpccxZTUkonVeIHaAf+
551o9FPhtSswLHWlNgL8XAhBK4vOHa/7zz8xgQ==
-----END CERTIFICATE-----

11
check.sh Executable file
View file

@ -0,0 +1,11 @@
#!/usr/bin/env bash
# This scripts runs various CI-like checks in a convenient way.
set -eux
cargo check --quiet --workspace --all-targets
cargo check --quiet --workspace --all-features --lib --target wasm32-unknown-unknown
cargo fmt --all -- --check
cargo clippy --quiet --workspace --all-targets --all-features -- -D warnings -W clippy::all
cargo test --quiet --workspace --all-targets --all-features
cargo test --quiet --workspace --doc
trunk build

2
config.toml Normal file
View file

@ -0,0 +1,2 @@
[target.wasm32-unknown-unknown]
rustflags = ["-C", "target-feature=+simd128"]

129
index.html Normal file
View file

@ -0,0 +1,129 @@
<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!-- Disable zooming: -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<head>
<!-- change this to your project name -->
<title>Isaac Mills's Portfolio</title>
<!-- config for our rust wasm binary. go to https://trunkrs.dev/assets/#rust for more customization -->
<link data-trunk rel="rust" data-wasm-opt="0" />
<!-- this is the base url relative to which other urls will be constructed. trunk will insert this from the public-url option -->
<base data-trunk-public-url />
<link data-trunk rel="icon" href="assets/favicon.ico">
<link data-trunk rel="copy-file" href="assets/icon-1024.png" />
<link data-trunk rel="copy-file" href="assets/icon-256.png" />
<link data-trunk rel="copy-file" href="assets/icon_ios_touch_192.png" />
<link data-trunk rel="copy-file" href="assets/maskable_icon_x512.png" />
<link data-trunk rel="copy-dir" href="assets/images" />
<link rel="apple-touch-icon" href="icon_ios_touch_192.png">
<meta name="theme-color" media="(prefers-color-scheme: light)" content="white">
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#404040">
<style>
html {
/* Remove touch delay: */
touch-action: manipulation;
}
body {
/* Light mode background color for what is not covered by the egui canvas,
or where the egui canvas is translucent. */
background: #909090;
}
@media (prefers-color-scheme: dark) {
body {
/* Dark mode background color for what is not covered by the egui canvas,
or where the egui canvas is translucent. */
background: #404040;
}
}
/* Allow canvas to fill entire web page: */
html,
body {
overflow: hidden;
margin: 0 !important;
padding: 0 !important;
height: 100%;
width: 100%;
}
/* Position canvas in center-top: */
canvas {
margin-right: auto;
margin-left: auto;
display: block;
position: absolute;
top: 0%;
left: 50%;
transform: translate(-50%, 0%);
}
.centered {
margin-right: auto;
margin-left: auto;
display: block;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: #f0f0f0;
font-size: 24px;
font-family: Ubuntu-Light, Helvetica, sans-serif;
text-align: center;
}
/* ---------------------------------------------- */
/* Loading animation from https://loading.io/css/ */
.lds-dual-ring {
display: inline-block;
width: 24px;
height: 24px;
}
.lds-dual-ring:after {
content: " ";
display: block;
width: 24px;
height: 24px;
margin: 0px;
border-radius: 50%;
border: 3px solid #fff;
border-color: #fff transparent #fff transparent;
animation: lds-dual-ring 1.2s linear infinite;
}
@keyframes lds-dual-ring {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
</style>
</head>
<body>
<!-- The WASM code will resize the canvas dynamically -->
<!-- the id is hardcoded in main.rs . so, make sure both match. -->
<canvas id="the_canvas_id"></canvas>
<!--Register Service Worker. this will cache the wasm / js scripts for offline use (for PWA functionality). -->
<!-- Force refresh (Ctrl + F5) to load the latest files instead of cached files -->
</body>
</html>
<!-- Powered by egui: https://github.com/emilk/egui/ -->

11
opt.sh Normal file
View file

@ -0,0 +1,11 @@
#!/bin/sh
wasm=dist/portfolio-*_bg.wasm
js=dist/portfolio-*.js
wasm-opt -O2 --fast-math $wasm -o $wasm
find dist/ \
-name "*.js" -o \
-name "*.pdf" -o \
-name "*.ico" -o \
-name "*.wasm" -o \
-name "*.html" -o \
-name "*.json" | parallel brotli -f

9
rust-toolchain Normal file
View file

@ -0,0 +1,9 @@
# If you see this, run "rustup self update" to get rustup 1.23 or newer.
# NOTE: above comment is for older `rustup` (before TOML support was added),
# which will treat the first line as the toolchain name, and therefore show it
# to the user in the error, instead of "error: invalid channel name '[toolchain]'".
[toolchain]
components = [ "rustfmt", "clippy" ]
targets = [ "wasm32-unknown-unknown" ]

16
src/about_me.jot Normal file
View file

@ -0,0 +1,16 @@
# About me
*Hi!* My name is Isaac Mills. I'm a software engineer and computer scientist who loves harnessing the power of technology to solve problems!
![Myself](images/me.jpg#256x192)
![Me and my dogoo](images/doggo.jpg#192x256)
![My family and I on a hike](images/hiking.jpg#256x192)
![Me in a Neumont CS T-Shirt](images/neumont.jpg#192x256)
- I love learning about computers. Everything from how they work, to new languages, to new ways to use them (I even learned a bit of WGSL and WGPU to make the shader in the background\*)
- I love looking for problems to solve, and working with people to solve them
- As a Boy Scout at heart, I love camping, hiking, backpacking, and just the outdoors generally
- I'm a loyal friend who will be there for you through thick and thin
- I know how to both write code for computers, as well as whip them into shape when they start having problems. I am the IT guy in my family
\*Special thanks to _meico_ from Shadertoy for the GLSL version of your Spectrum Ring shader

1026
src/app.rs Normal file

File diff suppressed because it is too large Load diff

3
src/font.wgsl Normal file
View file

@ -0,0 +1,3 @@
@fragment
fn fs_main(@location(1) : vec4<f32>) -> @location(0) vec4<f32> {
}

7
src/gimp.jot Normal file
View file

@ -0,0 +1,7 @@
# GIMP Experience
GIMP is a lot like Photoshop, but open source and free. Much like Photoshop, I don't think anyone can say they're _"100% fluent"_ in it, but I can say that I _am_ pretty experienced in it.
- This is a funny image I manipulated of a Pillsburry cookie jar that I thought looked like a pufferfish
![Pufferfish Doughboy](images/pufferfish.jpg#256x320)

24
src/inkscape.jot Normal file
View file

@ -0,0 +1,24 @@
# Inkscape Experience
For those who don't know, *Inkscape* is very similar to Adobe Illustrator, but open source and free. I am fluent, and have made numerous things in this program
- This project was for my Senior US Government class. It's a mock political advertisement for the fictional Political Action Comittee _Care_.
![Political Ad Campaign](images/pac1.jpg#256x362)
- This project was for my Senior Web Development class, and the assignment was to make a logo for a fictional company using what knowledge of Adobe Illustrator (Inkscape) we had
![Bitogo Corp logo and sologan](images/bitogo.jpg#256x362)
- This project was also for my Senior US Government class. It's a flag representing the mock country where the Angry Birds franchise takes place
![A mock flag for Bird Island](images/rovio.jpg#256x181)
- This project was for my mother, who is an educator who teaches people how to make books from upcycled materials you can find in your own home. These are a few of the colorways for an Instagram ad campaign I helped her make.
![Classic colorway](images/classic_scrappapercircus.jpg#256x256)
![Block colorway](images/block_scrappapercircus.jpg#256x256)
![Coptic colorway](images/coptic_scrappapercircus.jpg#256x256)

25
src/java.jot Normal file
View file

@ -0,0 +1,25 @@
# Java Experience
I've taken *AP Computer Science A*, as well as my school's post-AP course: *CS Data Structures*. Both courses are in Java.
- This is a painting of Saul Goodman using the [code.org](https://code.org) Neighborhood Painter. It's done using only it's named colors, and was made by generating Java code from an image file. [You can run it here](https://studio.code.org/projects/javalab/fsGVkmFdUWUeePTV6rYXnb21BD3bAjq6oVTMtKd13lE).
![Saul Goodman](images/saul_goodman.jpg#256x256)
- This is an auditory project done with [code.org](https://code.org)'s Java Theater. By using Rust code to parse MIDI files and generate an intermediate format which is parsed by Java, this project contains a library of 27 tracks from various video games which are played using the Theater's comically bad synthesizer. [You can run it here](https://studio.code.org/projects/javalab/SCaGR1_Et1sgc7sxNEvRSf-4RKplGVwIjd7O7WOeKmg)
![Theater playing Sewer Surfin](images/sewer_surfin.jpg#256x256)
- This was my most complicated [code.org](https://code.org) project. It's an entire 30 second short film about my personal narrative composed using only the synthesizer, and the shape drawing functions of the Theater. This was composed using a wide variety of tools
- The frames were composed in [Inkscape](#inkscape).
- The MIDI file was based on the Bad Piggies theme song, and was edited using [MIDIEditor](http://www.midieditor.org/). Within the MIDI file, custom events were used to interleave the frames of the animation with the MIDI notes.
- The MIDI file was put into a big converter which converted the MIDI, as well as all the SVG frames, into a lot of Java code, which in turn generated the movie using the code.org Theater.
[You can view the full movie here](https://studio.code.org/projects/javalab/kvhEgxPPEVMkjFFfNZz_n5L6ADRjLOSM2GMNJjGEcUc)
![Narrative frame 1](images/narrative1.jpg#256x256)
![Narrative frame 2](images/narrative2.jpg#256x256)
![Narrative frame 3](images/narrative3.jpg#256x256)
![Narrative frame 4](images/narrative4.jpg#256x256)
![Narrative frame 5](images/narrative5.jpg#256x256)

1
src/kdenlive.jot Normal file
View file

@ -0,0 +1 @@
# Kdenlive Experience

4
src/lib.rs Normal file
View file

@ -0,0 +1,4 @@
#![warn(clippy::all, rust_2018_idioms)]
mod app;
pub use app::Portfolio;

27
src/linux.jot Normal file
View file

@ -0,0 +1,27 @@
# GNU/Linux Experience
I've been daily driving Linux since the beginning of 2020, and have been hosting a home server running Linux since 2023.
- On my server at home, I am currently hosting
- [WireGuard](https://www.wireguard.com/)
- [Nextcloud](https://nextcloud.com/)
- [code-server](https://coder.com/docs/code-server/latest/install)
- [Forgejo](https://forgejo.org/)
- [Woodpecker CI](https://woodpecker-ci.org/)
- [Vaultwarden](https://github.com/dani-garcia/vaultwarden)
- [scrutiny](https://github.com/AnalogJ/scrutiny)
My daily driver right now, and the distro my server is running on, is the S6 variant of [Artix Linux](https://artixlinux.org/).
![Artix Linux](images/artix.png#128x128)
I've not only daily driven Linux, but I've also tailor made programs for it; using technologies such as Wayland, DBus, Wireplumber, and more.
- An image of my current Linux desktop. The status bar was written entirely by me in Rust ([dotfiles](https://github.com/StratusFearMe21/dotfiles))
![Dotfiles](images/dotfiles.jpg#512x288)
- Linux silliness (also uses my [dotfiles](https://github.com/StratusFearMe21/dotfiles))
![Chicanery](images/chicanery.jpg#512x288)

49
src/main.rs Normal file
View file

@ -0,0 +1,49 @@
#![warn(clippy::all, rust_2018_idioms)]
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release
use eframe::egui;
// When compiling natively:
#[cfg(not(target_arch = "wasm32"))]
fn main() -> eframe::Result<()> {
env_logger::init(); // Log to stderr (if you run with `RUST_LOG=debug`).
let native_options = eframe::NativeOptions {
viewport: egui::ViewportBuilder::default()
.with_inner_size([400.0, 300.0])
.with_min_inner_size([300.0, 220.0])
.with_icon(
// NOTE: Adding an icon is optional
eframe::icon_data::from_png_bytes(&include_bytes!("../assets/icon-256.png")[..])
.unwrap(),
),
..Default::default()
};
eframe::run_native(
"Isaac Mills's Portfolio",
native_options,
Box::new(|cc| Box::new(portfolio::Portfolio::new(cc))),
)
}
// When compiling to web using trunk:
#[cfg(target_arch = "wasm32")]
fn main() {
// Redirect `log` message to `console.log` and friends:
eframe::WebLogger::init(log::LevelFilter::Debug).ok();
let web_options = eframe::WebOptions {
..Default::default()
};
wasm_bindgen_futures::spawn_local(async {
eframe::WebRunner::new()
.start(
"the_canvas_id", // hardcode it
web_options,
Box::new(|cc| Box::new(portfolio::Portfolio::new(cc))),
)
.await
.expect("failed to start eframe");
});
}

3
src/postgresql.jot Normal file
View file

@ -0,0 +1,3 @@
# PostgreSQL Experience
If data needs basing, my database of choice is PostgreSQL. I've made a couple Discord bots that use PostgreSQL, and every service on my server that uses a DB, I have it hooked up to PostgreSQL. See my [GNU/Linux Experience page](#linux)

3
src/python.jot Normal file
View file

@ -0,0 +1,3 @@
# Python Experience
![Microsoft Technology Associate certificate](images/mta.jpg#512x377)

13
src/reaper.jot Normal file
View file

@ -0,0 +1,13 @@
# REAPER Experience
*REAPER* is a lot like Audacity, but paid and _waaaay_ better.
- This is a short piece of upbeat music I made in REAPER. [You can listen to it here](https://nations.lol/s/pbAN8y6rRw8T6nr)
![Nice Beat](images/nice_beat.jpg#512x288)
- In a Discord chat, a student from my college sent the chat [this piece of music he made](https://www.bandlab.com/track/fefa6cac-62a4-ee11-8926-000d3a428257?revId=fdfa6cac-62a4-ee11-8926-000d3a428257). Someone in chat said they thought it sounded like a Sonic theme, so I remixed his music with [For True Story by Circuit Freq RMX](https://www.youtube.com/watch?v=fgweT5OdLQY&pp=ygUgZm9yIHRydWUgc3Rvcnkgc29uaWMgZ2VuZXJhdGlvbnM%3D). A song from Sonic Generations. [You can listen to the remix here](https://cdn.discordapp.com/attachments/1110262902482542781/1193022053964582943/Get_down_wit_da_true_story_sonic_hedgehog.webm?ex=66077c5e&is=65f5075e&hm=e873c49de116e38e7f048615c6adafd8719913da7640107d15b4b537c4ca031e&)
![The Sonic remix](images/sonic_remix.jpg#512x288)
- I've also edited a podcast using REAPER. However, the podcast was for an assignment my friends were doing, and they would rather the recording not be floating around on the interwebs.

14
src/rust.jot Normal file
View file

@ -0,0 +1,14 @@
# Rust Experience
My language of choice is Rust. Everything I write on my own time, and everything I write if I can, I write it in Rust. Even this portfolio is written in Rust!
This portfolio uses these Rust crates:
- `jotdown`
- `databake`
- `eframe`
- `glyphon`
- `cosmic-text`
- `keyframe`
- `glam`
- `wgpu`

10
src/scratch.jot Normal file
View file

@ -0,0 +1,10 @@
# Scratch Experience
Every software developer worth their salt can say they're proficient in Scratch, but very few can say that they've made an award winning Scratch project. In 3rd grade, [my Scratch project](https://scratch.mit.edu/projects/144210368/) won 3rd place in the The Discovery's 2017 Scratch Code Challenge, hosted by the [Terry Lee Wells Discovery Museum](https://nvdm.org) in Reno, Nevada. To my memory, the competition was separated by grade level, and had ~1,000 international participants.
![Scratch Winner Image 1](images/scratch_winner1.jpg#256x192)
![Scratch Winner Image 2](images/scratch_winner2.jpg#256x192)
- And yes, I do have the medal and the Windows 10 Pro license to prove it
![Medal](images/scratch_medal.jpg#231x512)

68
src/shader.wgsl Normal file
View file

@ -0,0 +1,68 @@
struct Uniforms {
iResolution: vec2<f32>,
time: f32,
iMouse: vec2<f32>,
size: f32,
offset: vec2<f32>,
beamwidth: f32,
paddingtwo: f32
};
@group(0) @binding(0)
var<uniform> uni: Uniforms;
@vertex
fn vs_main(@builtin(vertex_index) vertex_index: u32) -> @builtin(position) vec4<f32> {
var x = f32(i32((vertex_index << u32(1)) & u32(2)));
var y = f32(i32(vertex_index & u32(2)));
var uv = vec2<f32>(x, y);
var out = 2.0 * uv - vec2<f32>(1.0, 1.0);
return vec4<f32>(out.x, out.y, 0.0, 1.0);
}
fn modulo(a: f32, b: f32) -> f32 {
return ((a % b) + b) % b;
}
@fragment
fn fs_main(@builtin(position) fragCoord: vec4<f32>) -> @location(0) vec4<f32> {
let iMouse = uni.iMouse + uni.offset;
let frag_coord = fragCoord + uni.offset.xyxy;
var p: vec2<f32>;
var m: vec2<f32>;
if (uni.iResolution.x < uni.iResolution.y) {
m = (2. * iMouse - uni.iResolution) / uni.iResolution.x;
p = (2. * frag_coord.xy - uni.iResolution) / uni.iResolution.x;
} else {
m = (2. * iMouse - uni.iResolution) / uni.iResolution.y;
p = (2. * frag_coord.xy - uni.iResolution) / uni.iResolution.y;
}
let tau: f32 = 3.1415927 * 2.;
let a: f32 = atan2(p.x, p.y);
let mousexy: f32 = atan2(m.x, m.y);
var r: f32 = length(p) * uni.size;
var l: f32 = length(m) * uni.size;
var mouse: vec2<f32> = vec2<f32>(mousexy / tau, l);
var uv: vec2<f32> = vec2<f32>(a / tau, r);
var xCol: f32 = uv.x * 3.;
xCol = modulo((xCol), (3.));
var horColour: vec3<f32> = vec3<f32>(0.25, 0.25, 0.25);
if (xCol < 1.) {
horColour.r = horColour.r + (1. - xCol);
horColour.g = horColour.g + (xCol);
} else { if (xCol < 2.) {
xCol = xCol - (1.);
horColour.g = horColour.g + (1. - xCol);
horColour.b = horColour.b + (xCol);
} else {
xCol = xCol - (2.);
horColour.b = horColour.b + (1. - xCol);
horColour.r = horColour.r + (xCol);
}
}
uv = 2. * uv - 1.;
mouse = 2. * mouse - 1.;
let beamWidth: f32 = (0.7 + 0.5 * sin((uv.x + (mouse.x - 0.2)) * 2. * tau * 0.15 * clamp(5., 0., 10.))) * abs(uni.beamwidth / (30. * uv.y));
let horBeam: vec3<f32> = vec3<f32>(beamWidth);
return vec4<f32>(horBeam * horColour, 1.);
}

1
src/tree_sitter.jot Normal file
View file

@ -0,0 +1 @@
# Tree-sitter Experience