134 Commits

Author SHA1 Message Date
4ea1fa4650 bobatheme: Revert adding height and width to <img>
BBaoVanC/bobatheme@cc7cec07df
2025-07-03 20:23:18 -05:00
865a71043c bobatheme: Set height and width on img tags
Prevents layout shifts on page load
2025-07-03 18:57:52 -05:00
be5229b963 post: Change subtitle to be more concise 2025-07-02 21:10:03 -05:00
8625e8ddce Hide extra zstd output messages from compress.sh 2025-07-02 19:35:59 -05:00
a3b5ce6ebd Add pagefind executable download to deploy workflow
Forgot to include it
2025-07-02 02:33:30 -05:00
e91a62ee18 Add search page using Pagefind
Updates #79. Still a bit rough but it works.
2025-07-02 02:14:42 -05:00
d450249171 Use separate dirs for building in demo.sh and staging.sh [skip ci]
Otherwise if you happen to be using `hugo serve` at the same time, it
overwrites stuff and messes up your live preview until you rebuild
(restart the hugo serve server)
2025-07-02 02:13:44 -05:00
86a03a676a Reform build scripts and actions workflows to reduce duplication
- Create audit.sh to hold all the audit related code
- Call compress.sh directly in build.sh
  - remove need for calling compress.sh in GitHub workflows
- Time each stage of compress.sh (each format) separately
- Run audit before staging or demo uploads
2025-07-01 18:49:34 -05:00
beba67ffbd WIP: add comments counter
Will finish it later, maybe depends on #82 because I don't see a good
speech bubble icon.
2025-07-01 03:20:37 -05:00
a7b1002e19 Use build.sh to share build code across all workflows and scripts
Instead of repeating the big long hugo commands every time
2025-07-01 03:18:12 -05:00
7851b864e2 Remove share-event.js placeholder inside bobatheme
If I remember correctly, it was there because I couldn't get global
resources to work right inside the bbaovanc.com repo so I just called it
inside the theme instead.
2025-07-01 00:53:25 -05:00
4d1542a242 Rename layouts/partials to layouts/_partials (Hugo 0.146) 2025-07-01 00:50:53 -05:00
88b5648a15 Fix __hugo_ctx error appearing from include shortcode
https://discourse.gohugo.io/t/weird-hugo-ctx-pid-34-inside-rendershortcodes/55176
2025-06-29 16:20:30 -05:00
8a8a35f6e5 Switch to improved snippet include shortcode
See BBaoVanC/bobatheme@67ac36e9e2
2025-06-29 03:54:22 -05:00
612d3b6c4f Pin Hugo to specific release on actions workflows 2025-06-28 03:23:32 -05:00
457b1c34cf Revert "test change"
This reverts commit 2016c34155f04f508d7a113892583c7dc71a75ae.

Accidentally merged it.
2025-06-28 03:04:47 -05:00
d23016b564 Add workflow to compare changes in rendered website
Mostly copied from the old Lighthouse auditing workflow code, but
updated upload-artifact from v3 to v4.
2025-06-28 03:02:00 -05:00
85f77c26de Rename Tinkering category to Experiments 2025-04-20 05:05:08 -05:00
3f3a60c3fc Update descriptions on taxonomy pages 2025-04-20 04:59:57 -05:00
61b31bfa63 Reorder projects list; update plausible link away from start page 2025-04-20 04:52:38 -05:00
6a7a253ea5 Update bobatheme (fixes for Hugo 0.146.0)
Also diffed the latest public deployment on my server and the only
change is the version, and the <time> tags use timezone names instead of
UTC offset numbers now.
2025-04-20 04:35:38 -05:00
6149d38e61 Re-enable discord sex hack page from being listed, and in sitemap
Turns out this option also prevents it from displaying in sitemap.xml.
2025-01-25 02:59:33 -06:00
159bd4b61d Update copyright year to 2025 2025-01-13 20:49:58 -06:00
2a5452858b Add audit grep for YUZSIQGHE (main block fallback in baseof.html) 2025-01-13 20:49:58 -06:00
e80970da7f Add zstd compression 2024-12-13 23:06:44 -06:00
e8368fd7cb Replace table shortcode with markdown attributes 2024-11-15 17:26:07 -06:00
7523df569c Add markdown output (BBaoVanC/bobatheme#56)
Allows viewing raw markdown code via a button on page, which is linked
to `[slug].md`.
2024-10-01 13:31:12 -05:00
20e69d482b Replace paginate with pagination.pagerSize in hugo.yaml 2024-09-24 21:18:41 -05:00
e1b6026aea Replace .Site.BaseURL with hugo.IsServer for enabling analytics
Seems like .Site.BaseURL had its logic changed somewhere along the road,
so it doesn't match anymore without trailing slash. Instead use a less
flimsy detection method which says if Hugo is running as development
server or not.
2024-09-24 21:18:16 -05:00
615547c525 Upgrade bobatheme 2024-09-24 21:18:16 -05:00
9e7be7afa3 Replace relative ref link
Not sure why this randomly stopped working, maybe some
non-backwards-compatible change in Hugo that I am not aware of.
2024-06-28 16:40:34 -05:00
55623221f1 Clarify a few details about how math challenge works 2024-06-28 16:37:15 -05:00
36eaa2b145 Remove a few extraneous tags 2024-01-22 21:13:59 -06:00
9e0c03b0db Change Software category to Reviews & update bobatheme 2024-01-22 20:53:13 -06:00
744a131b61 Update copyright year 2024-01-03 19:54:36 -06:00
19cb929ae9 Update bobatheme - update syntax CSS 2023-12-01 20:08:41 -06:00
b811714ca5 Update bobatheme - fix selecting code line numbers in Safari 2023-12-01 19:58:53 -06:00
508b0f6837 Fix heading levels in CONTRIBUTING.md [skip ci] 2023-11-15 11:39:41 -06:00
eac66611df Revert "Move comments CSS to <head>"
This reverts commit 7a1bf6c19c.

Turns out this doesn't work for some reason.
2023-11-11 20:49:02 -06:00
7a1bf6c19c Move comments CSS to <head> 2023-11-11 20:43:34 -06:00
0f4db51ba7 Clarify licensing
Website code is MIT; only the content is CC. Also change license from
CC BY to CC BY-SA.
2023-11-11 20:39:34 -06:00
ed9520adef Update bobatheme - remove back to top button 2023-11-05 18:02:16 -06:00
8f6722215e Update bobatheme - revert lazy loading bobastyle.css 2023-11-05 01:20:48 -05:00
7420561514 Update bobatheme - minor lazy loading performance tweaks
- Rename config.yaml to hugo.yaml
- Load syntax CSS async
- Load bobastyle.css async too
- Lazy load images
- Fix async loading of bobastyle.css
2023-11-05 01:12:21 -05:00
74dc4e75b2 Remove placeholder text from query-parameters tag
Must've been accidentally left in sometime
2023-11-03 23:42:23 -05:00
1cf5c2a324 Update bobatheme - Hugo v0.120.0 compatibility
- Patch link issue with delimit due to breaking change in Hugo v0.120
- Move site author to be under params due to .Site.Author deprecation
2023-11-03 23:35:21 -05:00
9a5a182879 Update bobatheme (fix print padding on main container) 2023-11-02 01:07:46 -05:00
5051c908e7 Update bobatheme
- Clean up dom layout of full-width page lists
- Remove option of latest posts section on bottom of content pages
- Add "Skip to main content" tab-focusable button
- Rename config.yaml to hugo.yaml
2023-10-21 21:54:05 -05:00
186e451422 Rename config.yaml to hugo.yaml [skip ci]
There was an update some time ago and now hugo.yaml is preferred because
of being more specific.
2023-10-21 20:51:33 -05:00
d816b189a2 Re-convert some old webp images to lossless
Had to grab the original files from
6bb94c50c2, and then run imagemagick again
with the webp lossless flag so the images don't look like garbage.

convert static/media/checkra1n-gui-on-arch-linux.png -define webp:lossless=true content/blog/checkra1n-gui-on-other-distros/gui.webp
2023-10-21 20:37:59 -05:00
49f57c2b5e Change bashsession highlighting to console
It got renamed to bash-session in some chroma update (maybe hugo hadn't
updated for a while), but console is just an alias for it anyways so
I'll use that instead.
2023-10-16 20:36:14 -05:00
8815ec6fe8 Remove gitignore rule for private drafts [skip ci] 2023-10-15 20:57:18 -05:00
73a900d36d Update bobatheme - Improve print compatiblity with navbar redesign 2023-10-15 20:54:34 -05:00
71e5e214db Change Status Page to just Status 2023-10-15 20:44:00 -05:00
2e613416e5 Update bobatheme - Fix wrong highlight in navbar 2023-10-15 19:42:19 -05:00
f0edaa67d5 Update bobatheme
- Revert ":3"
- Fix navbar highlighting on section page itself
- Redesign navbar to be full width
2023-10-15 19:36:35 -05:00
d367d1eda5 Show all isso comments by default 2023-06-24 12:48:35 -05:00
f9692f238b Remove aliases and handle redirects in caddy instead 2023-05-14 00:47:47 -05:00
15f0ec5c3e Fix Mozilla Contributors link 2023-04-25 08:55:31 -05:00
1e692ddc91 Update Links page 2023-04-16 00:02:34 -05:00
d03db67ec0 Remove /donate/ page 2023-04-15 23:26:15 -05:00
d268898446 Limit concurrency of deploy workflow 2023-04-15 23:23:26 -05:00
8f834d2662 Merge /contact/ into homepage 2023-04-15 23:16:15 -05:00
14565ea343 Remove leftover files for Lighthouse workflow [skip ci]
Leftover after removal in 1574cd8515
2023-04-15 19:27:25 -05:00
226fcfa099 Remove old boba.best link from homepage 2023-04-10 15:18:53 -05:00
3e03c1a2b0 Move some categories to be tags
Also:

- BBaoVanC/bobatheme@e8a34ae4a4
- Fix description of linux-swap tag
2023-04-10 15:14:23 -05:00
dd9936a74b Update bobatheme 2023-04-06 00:26:47 -05:00
1574cd8515 Remove Lighthouse auditing workflow 2023-04-04 17:41:43 -05:00
1d0d621963 Add swapfile guide (#28) 2023-04-04 17:32:52 -05:00
5f44c05e57 Hide discord sex hack from home page 2023-04-02 17:51:10 -05:00
0e67adf41c Update bobatheme - CSS cleanup 2023-03-24 08:51:09 -05:00
b4c695aeb4 Update bobatheme
- Remove credit.html partial
- Reorganize summary template files
- Fix margin around post-title
- Remove series position indicator
- :3
2023-03-18 21:39:27 -05:00
cdfcf3c372 Add procursus.social <link> 2023-02-24 22:47:43 -06:00
6d7dfa6c5d Fix <code> font size in comments 2023-02-22 16:41:16 -06:00
ef8dda9657 Replace deprecated set-output with $GITHUB_OUTPUT 2023-02-01 08:29:46 -06:00
f6b27235f3 Use actions/checkout v3 2023-01-31 20:47:00 -06:00
1ce61b8260 Update bobatheme
- Prevent page breaking in some elements when printing
- Use RenderString instead of markdownify in some places
2023-01-27 16:42:58 -06:00
f719cadd1e Update lastmod params that were outdated 2023-01-26 17:12:41 -06:00
43d4f47e29 Update bobatheme
- Add aria labels to share buttons
- Fix table borders between th and td in same line
- Add `link-1` color to light theme too
2023-01-26 16:54:29 -06:00
510e3e9bf9 Fix code block text size for mobile safari 2023-01-24 01:54:42 -06:00
685a9ed8f4 Use relative URL for font files 2023-01-24 01:34:47 -06:00
66fac8058f Make sure to audit drafts as well 2023-01-23 20:33:51 -06:00
e93871c923 Build drafts on pull requests [skip ci] 2023-01-23 20:28:23 -06:00
07f586e5b0 Add a markdown snippet to explain bashsession [skip ci]
Will be used by a future post
2023-01-23 20:25:04 -06:00
d21feef5b9 Serve our own fonts instead of using system 2023-01-22 20:46:51 -06:00
e49b0aa583 Various small fixes in bobatheme
- Finish support for list page subtitle
- Change color when hovering over share buttons
- Change print button to an <a> to match the rest of the buttons
- Make the left bar of blockquote lined up with rest of text
- Fix contrast of code block Copy button
- Fix keyboard accessibility of code block Copy button
2023-01-22 16:46:07 -06:00
91bc38bdd4 Update bobatheme (includes improvements to code blocks) 2023-01-22 00:11:22 -06:00
b80bd5732d Make the Copilot-generated post unlisted 2023-01-21 20:50:14 -06:00
b863f577ae Refresh code block design and add copy to clipboard
Fixes #58
2023-01-20 17:14:31 -06:00
c1806338e5 Unpin Hugo version in actions
It'll probably just get behind too often and hopefully there aren't
breaking changes.
2023-01-20 15:17:29 -06:00
f9c4fd8a9a Fix GitHub Copilot author page title capitalization 2023-01-18 14:58:16 -06:00
fb0e45d7cd Fix Mozilla Contributors URL 2023-01-16 21:04:09 -06:00
a0165e8569 Fix two more broken links due to git.boba.best/configs rename 2023-01-16 20:57:00 -06:00
100a86b85f bobatheme: Website header title should not be h1 2023-01-08 00:03:08 -06:00
8321945015 Add description to taxonomies and add some missing tag descriptions 2023-01-07 20:42:40 -06:00
48ed6eae21 Fix two broken links due to rename on git.boba.best 2023-01-07 19:21:05 -06:00
795be223eb Make copyright not look out of date 2022-12-27 20:58:35 -06:00
0e2a26fe56 Upgrade Hugo version to 0.108.0 2022-12-06 20:01:56 -06:00
c228d5c903 Add note that it only shows on desktop/web 2022-12-06 19:59:22 -06:00
f2494e515f Add notice to give credit to Rebane2001 2022-09-24 14:56:05 -05:00
4cd6632799 Pin Hugo to specific version (0.102.3 currently)
This prevents the website from breaking due to breaking changes in Hugo.
2022-09-15 19:25:46 -05:00
bde9df2aa6 Tweak spacing under page h1 headings 2022-07-20 21:49:09 -05:00
87c5d4f1b3 Update bobatheme -- prevent console prompt symbol highlighting 2022-07-19 00:09:33 -05:00
31a72c92fa Update bobatheme -- fixed syntax highlighting styling 2022-07-02 19:01:25 -05:00
bc76fb5458 Update comments.css for latest Isso version & update bobatheme 2022-06-30 20:09:19 -05:00
ddb0045088 Move comments CSS to separate file 2022-06-15 15:10:46 -05:00
2fb0d17df1 Update comments CSS to match latest Isso version 2022-06-07 15:05:54 -05:00
060d3ecd84 Add :focus rule for isso-textarea 2022-05-28 17:01:32 -05:00
fd6eb50399 Update Isso CSS since <textarea> is used now 2022-05-28 15:18:00 -05:00
87688ef6b3 Remove references to bobaforum and move back to GitHub Discussions 2022-05-24 22:51:19 -05:00
01c2b34920 Remove newsletter + update bobatheme (semantic HTML tweaks) 2022-05-23 02:17:47 -05:00
c014da3fe3 Update bobatheme - semantic HTML improvements 2022-05-21 23:25:55 -05:00
7d5309862e Update footnote because txnor.com now redirects to YT video 2022-05-21 20:57:55 -05:00
cef5fe28dc Update bobatheme -- :target styling 2022-05-21 20:57:09 -05:00
7a529fb1ac Mention YT video and that math challenge isn't cached 2022-05-21 20:29:48 -05:00
852aafb2e7 Update Caddy install steps 2022-05-18 17:53:53 -05:00
c50d3fda88 Update bobatheme & fix tab focus styling on Isso buttons 2022-05-18 17:21:12 -05:00
6f1c5a883f Add data-title attribute to #isso-thread 2022-05-16 18:39:44 -05:00
6a941cef7c Disable latest posts section on content pages 2022-05-16 00:57:10 -05:00
44c1291fa4 Remove bbaovanc from Copilot post authors 2022-05-16 00:52:13 -05:00
dba36c5105 Add default image, s/w/ord, 6969th, math challenge, & source code links 2022-05-15 19:23:09 -05:00
6145d4e8d7 Update bobatheme - small tweak 2022-05-15 18:26:47 -05:00
c5a2e84050 Animation target-fade renamed to isso-target-fade 2022-05-15 15:42:56 -05:00
94a2404a83 Update bobatheme (complete color scheme overhaul) 2022-05-14 23:38:32 -05:00
fec8bd1933 Make comments take up full width when printing 2022-05-14 23:36:44 -05:00
27bc4e28a8 Make Copilot post slightly newer to prevent .Related race condition 2022-05-14 15:56:33 -05:00
e9ad2abd55 Make an attempt to ignore whitespace changes 2022-05-14 15:30:17 -05:00
f0036f20b9 Update bobatheme (should have basically no changes) 2022-05-13 22:14:46 -05:00
2fc8e4646e Mention IRC as a reason for sed syntax 2022-05-13 22:13:02 -05:00
da8dc12957 Add "Discord sex" post 2022-05-11 21:18:57 -05:00
86f4b102d7 Remove outdated note saying that comment system won't work on previews [skip ci] 2022-05-11 18:24:32 -05:00
d7e219d331 Fix LHCI uploads (#27) 2022-05-11 18:22:09 -05:00
5b0c092bc0 Update bobatheme - taxonomy formatting 2022-05-10 12:05:19 -05:00
2ce66a14d4 Run Lighthouse for all changed pages (#26) 2022-05-09 17:27:34 -05:00
84 changed files with 1985 additions and 882 deletions

View File

@ -2,100 +2,29 @@ name: Audit
on:
push:
pull_request:
jobs:
lighthouse:
runs-on: ubuntu-latest
steps:
- name: Checkount
uses: actions/checkout@v2
with:
submodules: recursive
fetch-depth: 0
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Install Caddy
run: |
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asc
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
sudo systemctl disable --now caddy
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: latest
extended: true
- name: Build
run: hugo --printI18nWarnings --printPathWarnings --baseURL https://localhost
- name: Compress
run: time ./compress.sh
- name: Audit using Lighthouse
uses: treosh/lighthouse-ci-action@v9
with:
uploadArtifacts: true
configPath: ./lighthouserc.yaml
runs: 3
serverBaseUrl: https://lhci.bbaovanc.com/
# this should be safe since it only allows adding (not deleting) data
serverToken: 926a24f2-90e4-48b1-809f-055b9408cf4b
audit:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3
with:
submodules: recursive
fetch-depth: 0
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Read HUGO_VERSION
id: hugo_version
run: echo "HUGO_VERSION=$(cat HUGO_VERSION)" >> $GITHUB_OUTPUT
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
uses: peaceiris/actions-hugo@v3
with:
hugo-version: latest
hugo-version: ${{ steps.hugo_version.outputs.HUGO_VERSION }}
extended: true
- name: Build
run: |
HUGO_MINIFY_TDEWOLFF_HTML_KEEPCOMMENTS=true HUGO_ENABLEMISSINGTRANSLATIONPLACEHOLDERS=true hugo --printI18nWarnings --printPathWarnings
# For the following steps, see
# https://discourse.gohugo.io/t/audit-your-published-site-for-problems/35184
- name: Audit - raw HTML
if: always()
run: |
! grep -inorE "<\!-- raw HTML omitted -->" public/
- name: Audit - ZgotmplZ (unsafe URL content)
if: always()
run: |
! grep -inorE "ZgotmplZ" public/
#- name: Audit - missing translations
# if: always()
# run: |
# ! grep -inorE "\[i18n\]" public/
- name: Audit - nil values in printf
if: always()
run: |
! grep -inorE "\(<nil>\)" public/
- name: Audit - nil values in printf without safeHTML
if: always()
run: |
! grep -inorE "(&lt;nil&gt;)" public/
- name: Audit - HAHAHUGO
if: always()
run: |
! grep -inorE "hahahugo" public/
- name: Run audit
run: ./audit.sh

View File

@ -1,5 +1,9 @@
name: Deploy
concurrency:
group: deploy-production
cancel-in-progress: true
on:
workflow_dispatch:
push:
@ -14,23 +18,29 @@ jobs:
url: https://bbaovanc.com
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3
with:
submodules: recursive
fetch-depth: 0
- name: Read HUGO_VERSION
id: hugo_version
run: echo "HUGO_VERSION=$(cat HUGO_VERSION)" >> $GITHUB_OUTPUT
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
uses: peaceiris/actions-hugo@v3
with:
hugo-version: latest
hugo-version: ${{ steps.hugo_version.outputs.HUGO_VERSION }}
extended: true
- name: Build
run: hugo --printI18nWarnings --printPathWarnings
- name: Compress
- name: Download Pagefind
run: |
time sudo ./compress.sh
mkdir -p ~/.local/bin/
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
curl -L https://github.com/Pagefind/pagefind/releases/download/v1.3.0/pagefind-v1.3.0-x86_64-unknown-linux-musl.tar.gz | tar zxv -C ~/.local/bin pagefind
- name: Build
run: ./build.sh
- name: Setup SSH
uses: kielabokkie/ssh-key-and-known-hosts-action@v1

72
.github/workflows/diff.yml vendored Normal file
View File

@ -0,0 +1,72 @@
name: Diff
on:
push:
pull_request:
jobs:
compare:
runs-on: ubuntu-latest
steps:
- name: Checkout previous (pull_request)
if: github.event.pull_request
uses: actions/checkout@v3
with:
submodules: recursive
fetch-depth: 0
ref: ${{ github.event.pull_request.base.ref }}
- name: Checkout previous (push)
if: github.event_name == 'push'
uses: actions/checkout@v3
with:
submodules: recursive
fetch-depth: 0
ref: ${{ github.event.before }}
- name: Read HUGO_VERSION (previous)
id: hugo_version_old
run: echo "HUGO_VERSION=$(cat HUGO_VERSION)" >> $GITHUB_OUTPUT
- name: Setup Hugo (previous)
uses: peaceiris/actions-hugo@v3
with:
hugo-version: ${{ steps.hugo_version_old.outputs.HUGO_VERSION }}
extended: true
- name: Build previous
run: |
NO_SEARCH=y NO_COMPRESS=y DEST=old/ ./build.sh
- name: Checkout current
uses: actions/checkout@v3
with:
submodules: recursive
fetch-depth: 0
clean: false
- name: Read HUGO_VERSION (current)
id: hugo_version_new
run: echo "HUGO_VERSION=$(cat HUGO_VERSION)" >> $GITHUB_OUTPUT
- name: Setup Hugo (current)
uses: peaceiris/actions-hugo@v3
with:
hugo-version: ${{ steps.hugo_version_new.outputs.HUGO_VERSION }}
extended: true
- name: Build current
run: |
NO_SEARCH=y NO_COMPRESS=y DEST=new/ ./build.sh
- name: Print filenames changed
run: diff -qr old/ new/ || true
- name: Save full diff
run: diff -r old/ new/ | tee changes.diff || true
- name: Upload full diff
uses: actions/upload-artifact@v4
with:
name: diff
path: changes.diff

View File

@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3
with:
submodules: recursive
fetch-depth: 0
@ -29,18 +29,18 @@ jobs:
ref: ${{ github.head_ref }}
no_override: false
- name: Read HUGO_VERSION
id: hugo_version
run: echo "HUGO_VERSION=$(cat HUGO_VERSION)" >> $GITHUB_OUTPUT
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
uses: peaceiris/actions-hugo@v3
with:
hugo-version: latest
hugo-version: ${{ steps.hugo_version.outputs.HUGO_VERSION }}
extended: true
- name: Build
run: hugo --printI18nWarnings --printPathWarnings --baseURL "https://demo.bbaovanc.com/pull_request/${{ github.event.number }}"
- name: Compress
run: |
time sudo ./compress.sh
run: ./build.sh --baseURL "https://demo.bbaovanc.com/pull_request/${{ github.event.number }}"
- name: Setup SSH
uses: kielabokkie/ssh-key-and-known-hosts-action@v1
@ -91,5 +91,4 @@ jobs:
A preview of this pull request is ready!
See it at https://demo.bbaovanc.com/pull_request/${{ github.event.number }}/
View the deploy log at https://github.com/BBaoVanC/bbaovanc.com/actions/runs/${{ github.run_id}}
Please note that currently the comment system is only operational on real deploys on bbaovanc.com. If you see an error, it's probably not your fault.
edit-mode: replace

5
.gitignore vendored
View File

@ -17,5 +17,6 @@ hugo.linux
/.hugo_build.lock
# My private drafts
/content/blog/drafts/
# used in demo.sh and staging.sh
/public.demo/
/public.staging/

View File

@ -1,21 +1,15 @@
# Contributing to bobatheme
## Where to put questions/issues/etc
Please use the [proper section on
bobaforum](https://forum.bbaovanc.com/t/my-website) for issues, questions, or
discussions.
## Building
Just in case you need it.
## Automatic deploy previews with GitHub Actions
### Automatic deploy previews with GitHub Actions
My GitHub Actions workflows will automatically build each pull request into a
public deploy preview on demo.bbaovanc.com, and will link it in a comment.
## Manual (local) building
### Manual (local) building
You can also build the site yourself using Hugo, including a live local preview.

View File

@ -1,9 +0,0 @@
# vim: ft=caddyfile
https://localhost {
header Cache-Control no-cache
root * public/
file_server {
precompressed br gzip
}
}

1
HUGO_VERSION Normal file
View File

@ -0,0 +1 @@
0.147.9

737
LICENSE
View File

@ -1,396 +1,451 @@
Attribution 4.0 International
=======================================================================
Creative Commons Corporation ("Creative Commons") is not a law firm and
does not provide legal services or legal advice. Distribution of
Creative Commons public licenses does not create a lawyer-client or
other relationship. Creative Commons makes its licenses and related
information available on an "as-is" basis. Creative Commons gives no
warranties regarding its licenses, any material licensed under their
terms and conditions, or any related information. Creative Commons
disclaims all liability for damages resulting from their use to the
fullest extent possible.
Using Creative Commons Public Licenses
Creative Commons public licenses provide a standard set of terms and
conditions that creators and other rights holders may use to share
original works of authorship and other material subject to copyright
and certain other rights specified in the public license below. The
following considerations are for informational purposes only, are not
exhaustive, and do not form part of our licenses.
Considerations for licensors: Our public licenses are
intended for use by those authorized to give the public
permission to use material in ways otherwise restricted by
copyright and certain other rights. Our licenses are
irrevocable. Licensors should read and understand the terms
and conditions of the license they choose before applying it.
Licensors should also secure all rights necessary before
applying our licenses so that the public can reuse the
material as expected. Licensors should clearly mark any
material not subject to the license. This includes other CC-
licensed material, or material used under an exception or
limitation to copyright. More considerations for licensors:
wiki.creativecommons.org/Considerations_for_licensors
Considerations for the public: By using one of our public
licenses, a licensor grants the public permission to use the
licensed material under specified terms and conditions. If
the licensor's permission is not necessary for any reason--for
example, because of any applicable exception or limitation to
copyright--then that use is not regulated by the license. Our
licenses grant only permissions under copyright and certain
other rights that a licensor has authority to grant. Use of
the licensed material may still be restricted for other
reasons, including because others have copyright or other
rights in the material. A licensor may make special requests,
such as asking that all changes be marked or described.
Although not required by our licenses, you are encouraged to
respect those requests where reasonable. More considerations
for the public:
wiki.creativecommons.org/Considerations_for_licensees
=======================================================================
Creative Commons Attribution 4.0 International Public License
By exercising the Licensed Rights (defined below), You accept and agree
to be bound by the terms and conditions of this Creative Commons
Attribution 4.0 International Public License ("Public License"). To the
extent this Public License may be interpreted as a contract, You are
granted the Licensed Rights in consideration of Your acceptance of
these terms and conditions, and the Licensor grants You such rights in
consideration of benefits the Licensor receives from making the
Licensed Material available under these terms and conditions.
Section 1 -- Definitions.
a. Adapted Material means material subject to Copyright and Similar
Rights that is derived from or based upon the Licensed Material
and in which the Licensed Material is translated, altered,
arranged, transformed, or otherwise modified in a manner requiring
permission under the Copyright and Similar Rights held by the
Licensor. For purposes of this Public License, where the Licensed
Material is a musical work, performance, or sound recording,
Adapted Material is always produced where the Licensed Material is
synched in timed relation with a moving image.
b. Adapter's License means the license You apply to Your Copyright
and Similar Rights in Your contributions to Adapted Material in
accordance with the terms and conditions of this Public License.
c. Copyright and Similar Rights means copyright and/or similar rights
closely related to copyright including, without limitation,
performance, broadcast, sound recording, and Sui Generis Database
Rights, without regard to how the rights are labeled or
categorized. For purposes of this Public License, the rights
specified in Section 2(b)(1)-(2) are not Copyright and Similar
Rights.
d. Effective Technological Measures means those measures that, in the
absence of proper authority, may not be circumvented under laws
fulfilling obligations under Article 11 of the WIPO Copyright
Treaty adopted on December 20, 1996, and/or similar international
agreements.
e. Exceptions and Limitations means fair use, fair dealing, and/or
any other exception or limitation to Copyright and Similar Rights
that applies to Your use of the Licensed Material.
f. Licensed Material means the artistic or literary work, database,
or other material to which the Licensor applied this Public
License.
g. Licensed Rights means the rights granted to You subject to the
terms and conditions of this Public License, which are limited to
all Copyright and Similar Rights that apply to Your use of the
Licensed Material and that the Licensor has authority to license.
h. Licensor means the individual(s) or entity(ies) granting rights
under this Public License.
i. Share means to provide material to the public by any means or
process that requires permission under the Licensed Rights, such
as reproduction, public display, public performance, distribution,
dissemination, communication, or importation, and to make material
available to the public including in ways that members of the
public may access the material from a place and at a time
individually chosen by them.
j. Sui Generis Database Rights means rights other than copyright
resulting from Directive 96/9/EC of the European Parliament and of
the Council of 11 March 1996 on the legal protection of databases,
as amended and/or succeeded, as well as other essentially
equivalent rights anywhere in the world.
k. You means the individual or entity exercising the Licensed Rights
under this Public License. Your has a corresponding meaning.
Section 2 -- Scope.
a. License grant.
1. Subject to the terms and conditions of this Public License,
the Licensor hereby grants You a worldwide, royalty-free,
non-sublicensable, non-exclusive, irrevocable license to
exercise the Licensed Rights in the Licensed Material to:
a. reproduce and Share the Licensed Material, in whole or
in part; and
b. produce, reproduce, and Share Adapted Material.
2. Exceptions and Limitations. For the avoidance of doubt, where
Exceptions and Limitations apply to Your use, this Public
License does not apply, and You do not need to comply with
its terms and conditions.
3. Term. The term of this Public License is specified in Section
6(a).
4. Media and formats; technical modifications allowed. The
Licensor authorizes You to exercise the Licensed Rights in
all media and formats whether now known or hereafter created,
and to make technical modifications necessary to do so. The
Licensor waives and/or agrees not to assert any right or
authority to forbid You from making technical modifications
necessary to exercise the Licensed Rights, including
technical modifications necessary to circumvent Effective
Technological Measures. For purposes of this Public License,
simply making modifications authorized by this Section 2(a)
(4) never produces Adapted Material.
The non-content code in this repository follows the MIT License:
Copyright (c) 2021 BBaoVanC
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
The content (articles, images/media, etc) follow CC-BY-SA 4.0:
Attribution-ShareAlike 4.0 International
=======================================================================
Creative Commons Corporation ("Creative Commons") is not a law firm and
does not provide legal services or legal advice. Distribution of
Creative Commons public licenses does not create a lawyer-client or
other relationship. Creative Commons makes its licenses and related
information available on an "as-is" basis. Creative Commons gives no
warranties regarding its licenses, any material licensed under their
terms and conditions, or any related information. Creative Commons
disclaims all liability for damages resulting from their use to the
fullest extent possible.
Using Creative Commons Public Licenses
Creative Commons public licenses provide a standard set of terms and
conditions that creators and other rights holders may use to share
original works of authorship and other material subject to copyright
and certain other rights specified in the public license below. The
following considerations are for informational purposes only, are not
exhaustive, and do not form part of our licenses.
Considerations for licensors: Our public licenses are
intended for use by those authorized to give the public
permission to use material in ways otherwise restricted by
copyright and certain other rights. Our licenses are
irrevocable. Licensors should read and understand the terms
and conditions of the license they choose before applying it.
Licensors should also secure all rights necessary before
applying our licenses so that the public can reuse the
material as expected. Licensors should clearly mark any
material not subject to the license. This includes other CC-
licensed material, or material used under an exception or
limitation to copyright. More considerations for licensors:
wiki.creativecommons.org/Considerations_for_licensors
Considerations for the public: By using one of our public
licenses, a licensor grants the public permission to use the
licensed material under specified terms and conditions. If
the licensor's permission is not necessary for any reason--for
example, because of any applicable exception or limitation to
copyright--then that use is not regulated by the license. Our
licenses grant only permissions under copyright and certain
other rights that a licensor has authority to grant. Use of
the licensed material may still be restricted for other
reasons, including because others have copyright or other
rights in the material. A licensor may make special requests,
such as asking that all changes be marked or described.
Although not required by our licenses, you are encouraged to
respect those requests where reasonable. More considerations
for the public:
wiki.creativecommons.org/Considerations_for_licensees
=======================================================================
Creative Commons Attribution-ShareAlike 4.0 International Public
License
By exercising the Licensed Rights (defined below), You accept and agree
to be bound by the terms and conditions of this Creative Commons
Attribution-ShareAlike 4.0 International Public License ("Public
License"). To the extent this Public License may be interpreted as a
contract, You are granted the Licensed Rights in consideration of Your
acceptance of these terms and conditions, and the Licensor grants You
such rights in consideration of benefits the Licensor receives from
making the Licensed Material available under these terms and
conditions.
Section 1 -- Definitions.
a. Adapted Material means material subject to Copyright and Similar
Rights that is derived from or based upon the Licensed Material
and in which the Licensed Material is translated, altered,
arranged, transformed, or otherwise modified in a manner requiring
permission under the Copyright and Similar Rights held by the
Licensor. For purposes of this Public License, where the Licensed
Material is a musical work, performance, or sound recording,
Adapted Material is always produced where the Licensed Material is
synched in timed relation with a moving image.
b. Adapter's License means the license You apply to Your Copyright
and Similar Rights in Your contributions to Adapted Material in
accordance with the terms and conditions of this Public License.
c. BY-SA Compatible License means a license listed at
creativecommons.org/compatiblelicenses, approved by Creative
Commons as essentially the equivalent of this Public License.
d. Copyright and Similar Rights means copyright and/or similar rights
closely related to copyright including, without limitation,
performance, broadcast, sound recording, and Sui Generis Database
Rights, without regard to how the rights are labeled or
categorized. For purposes of this Public License, the rights
specified in Section 2(b)(1)-(2) are not Copyright and Similar
Rights.
e. Effective Technological Measures means those measures that, in the
absence of proper authority, may not be circumvented under laws
fulfilling obligations under Article 11 of the WIPO Copyright
Treaty adopted on December 20, 1996, and/or similar international
agreements.
f. Exceptions and Limitations means fair use, fair dealing, and/or
any other exception or limitation to Copyright and Similar Rights
that applies to Your use of the Licensed Material.
g. License Elements means the license attributes listed in the name
of a Creative Commons Public License. The License Elements of this
Public License are Attribution and ShareAlike.
h. Licensed Material means the artistic or literary work, database,
or other material to which the Licensor applied this Public
License.
i. Licensed Rights means the rights granted to You subject to the
terms and conditions of this Public License, which are limited to
all Copyright and Similar Rights that apply to Your use of the
Licensed Material and that the Licensor has authority to license.
j. Licensor means the individual(s) or entity(ies) granting rights
under this Public License.
k. Share means to provide material to the public by any means or
process that requires permission under the Licensed Rights, such
as reproduction, public display, public performance, distribution,
dissemination, communication, or importation, and to make material
available to the public including in ways that members of the
public may access the material from a place and at a time
individually chosen by them.
l. Sui Generis Database Rights means rights other than copyright
resulting from Directive 96/9/EC of the European Parliament and of
the Council of 11 March 1996 on the legal protection of databases,
as amended and/or succeeded, as well as other essentially
equivalent rights anywhere in the world.
m. You means the individual or entity exercising the Licensed Rights
under this Public License. Your has a corresponding meaning.
Section 2 -- Scope.
a. License grant.
1. Subject to the terms and conditions of this Public License,
the Licensor hereby grants You a worldwide, royalty-free,
non-sublicensable, non-exclusive, irrevocable license to
exercise the Licensed Rights in the Licensed Material to:
a. reproduce and Share the Licensed Material, in whole or
in part; and
b. produce, reproduce, and Share Adapted Material.
2. Exceptions and Limitations. For the avoidance of doubt, where
Exceptions and Limitations apply to Your use, this Public
License does not apply, and You do not need to comply with
its terms and conditions.
3. Term. The term of this Public License is specified in Section
6(a).
4. Media and formats; technical modifications allowed. The
Licensor authorizes You to exercise the Licensed Rights in
all media and formats whether now known or hereafter created,
and to make technical modifications necessary to do so. The
Licensor waives and/or agrees not to assert any right or
authority to forbid You from making technical modifications
necessary to exercise the Licensed Rights, including
technical modifications necessary to circumvent Effective
Technological Measures. For purposes of this Public License,
simply making modifications authorized by this Section 2(a)
(4) never produces Adapted Material.
5. Downstream recipients.
a. Offer from the Licensor -- Licensed Material. Every
recipient of the Licensed Material automatically
receives an offer from the Licensor to exercise the
Licensed Rights under the terms and conditions of this
Public License.
b. Additional offer from the Licensor -- Adapted Material.
Every recipient of Adapted Material from You
automatically receives an offer from the Licensor to
exercise the Licensed Rights in the Adapted Material
under the conditions of the Adapter's License You apply.
c. No downstream restrictions. You may not offer or impose
any additional or different terms or conditions on, or
apply any Effective Technological Measures to, the
Licensed Material if doing so restricts exercise of the
Licensed Rights by any recipient of the Licensed
Material.
5. Downstream recipients.
a. Offer from the Licensor -- Licensed Material. Every
recipient of the Licensed Material automatically
receives an offer from the Licensor to exercise the
Licensed Rights under the terms and conditions of this
Public License.
b. No downstream restrictions. You may not offer or impose
any additional or different terms or conditions on, or
apply any Effective Technological Measures to, the
Licensed Material if doing so restricts exercise of the
Licensed Rights by any recipient of the Licensed
Material.
6. No endorsement. Nothing in this Public License constitutes or
may be construed as permission to assert or imply that You
are, or that Your use of the Licensed Material is, connected
with, or sponsored, endorsed, or granted official status by,
the Licensor or others designated to receive attribution as
provided in Section 3(a)(1)(A)(i).
6. No endorsement. Nothing in this Public License constitutes or
may be construed as permission to assert or imply that You
are, or that Your use of the Licensed Material is, connected
with, or sponsored, endorsed, or granted official status by,
the Licensor or others designated to receive attribution as
provided in Section 3(a)(1)(A)(i).
b. Other rights.
b. Other rights.
1. Moral rights, such as the right of integrity, are not
licensed under this Public License, nor are publicity,
privacy, and/or other similar personality rights; however, to
the extent possible, the Licensor waives and/or agrees not to
assert any such rights held by the Licensor to the limited
extent necessary to allow You to exercise the Licensed
Rights, but not otherwise.
1. Moral rights, such as the right of integrity, are not
licensed under this Public License, nor are publicity,
privacy, and/or other similar personality rights; however, to
the extent possible, the Licensor waives and/or agrees not to
assert any such rights held by the Licensor to the limited
extent necessary to allow You to exercise the Licensed
Rights, but not otherwise.
2. Patent and trademark rights are not licensed under this
Public License.
2. Patent and trademark rights are not licensed under this
Public License.
3. To the extent possible, the Licensor waives any right to
collect royalties from You for the exercise of the Licensed
Rights, whether directly or through a collecting society
under any voluntary or waivable statutory or compulsory
licensing scheme. In all other cases the Licensor expressly
reserves any right to collect such royalties.
Section 3 -- License Conditions.
3. To the extent possible, the Licensor waives any right to
collect royalties from You for the exercise of the Licensed
Rights, whether directly or through a collecting society
under any voluntary or waivable statutory or compulsory
licensing scheme. In all other cases the Licensor expressly
reserves any right to collect such royalties.
Your exercise of the Licensed Rights is expressly made subject to the
following conditions.
a. Attribution.
Section 3 -- License Conditions.
1. If You Share the Licensed Material (including in modified
form), You must:
Your exercise of the Licensed Rights is expressly made subject to the
following conditions.
a. retain the following if it is supplied by the Licensor
with the Licensed Material:
a. Attribution.
i. identification of the creator(s) of the Licensed
Material and any others designated to receive
attribution, in any reasonable manner requested by
the Licensor (including by pseudonym if
designated);
1. If You Share the Licensed Material (including in modified
form), You must:
ii. a copyright notice;
a. retain the following if it is supplied by the Licensor
with the Licensed Material:
iii. a notice that refers to this Public License;
i. identification of the creator(s) of the Licensed
Material and any others designated to receive
attribution, in any reasonable manner requested by
the Licensor (including by pseudonym if
designated);
iv. a notice that refers to the disclaimer of
warranties;
ii. a copyright notice;
v. a URI or hyperlink to the Licensed Material to the
extent reasonably practicable;
iii. a notice that refers to this Public License;
iv. a notice that refers to the disclaimer of
warranties;
b. indicate if You modified the Licensed Material and
retain an indication of any previous modifications; and
v. a URI or hyperlink to the Licensed Material to the
extent reasonably practicable;
c. indicate the Licensed Material is licensed under this
Public License, and include the text of, or the URI or
hyperlink to, this Public License.
b. indicate if You modified the Licensed Material and
retain an indication of any previous modifications; and
c. indicate the Licensed Material is licensed under this
Public License, and include the text of, or the URI or
hyperlink to, this Public License.
2. You may satisfy the conditions in Section 3(a)(1) in any
reasonable manner based on the medium, means, and context in
which You Share the Licensed Material. For example, it may be
reasonable to satisfy the conditions by providing a URI or
hyperlink to a resource that includes the required
information.
2. You may satisfy the conditions in Section 3(a)(1) in any
reasonable manner based on the medium, means, and context in
which You Share the Licensed Material. For example, it may be
reasonable to satisfy the conditions by providing a URI or
hyperlink to a resource that includes the required
information.
3. If requested by the Licensor, You must remove any of the
information required by Section 3(a)(1)(A) to the extent
reasonably practicable.
3. If requested by the Licensor, You must remove any of the
information required by Section 3(a)(1)(A) to the extent
reasonably practicable.
b. ShareAlike.
4. If You Share Adapted Material You produce, the Adapter's
License You apply must not prevent recipients of the Adapted
Material from complying with this Public License.
In addition to the conditions in Section 3(a), if You Share
Adapted Material You produce, the following conditions also apply.
1. The Adapter's License You apply must be a Creative Commons
license with the same License Elements, this version or
later, or a BY-SA Compatible License.
Section 4 -- Sui Generis Database Rights.
2. You must include the text of, or the URI or hyperlink to, the
Adapter's License You apply. You may satisfy this condition
in any reasonable manner based on the medium, means, and
context in which You Share Adapted Material.
Where the Licensed Rights include Sui Generis Database Rights that
apply to Your use of the Licensed Material:
3. You may not offer or impose any additional or different terms
or conditions on, or apply any Effective Technological
Measures to, Adapted Material that restrict exercise of the
rights granted under the Adapter's License You apply.
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
to extract, reuse, reproduce, and Share all or a substantial
portion of the contents of the database;
b. if You include all or a substantial portion of the database
contents in a database in which You have Sui Generis Database
Rights, then the database in which You have Sui Generis Database
Rights (but not its individual contents) is Adapted Material; and
Section 4 -- Sui Generis Database Rights.
c. You must comply with the conditions in Section 3(a) if You Share
all or a substantial portion of the contents of the database.
Where the Licensed Rights include Sui Generis Database Rights that
apply to Your use of the Licensed Material:
For the avoidance of doubt, this Section 4 supplements and does not
replace Your obligations under this Public License where the Licensed
Rights include other Copyright and Similar Rights.
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
to extract, reuse, reproduce, and Share all or a substantial
portion of the contents of the database;
b. if You include all or a substantial portion of the database
contents in a database in which You have Sui Generis Database
Rights, then the database in which You have Sui Generis Database
Rights (but not its individual contents) is Adapted Material,
including for purposes of Section 3(b); and
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
c. You must comply with the conditions in Section 3(a) if You Share
all or a substantial portion of the contents of the database.
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
For the avoidance of doubt, this Section 4 supplements and does not
replace Your obligations under this Public License where the Licensed
Rights include other Copyright and Similar Rights.
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
c. The disclaimer of warranties and limitation of liability provided
above shall be interpreted in a manner that, to the extent
possible, most closely approximates an absolute disclaimer and
waiver of all liability.
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
Section 6 -- Term and Termination.
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
a. This Public License applies for the term of the Copyright and
Similar Rights licensed here. However, if You fail to comply with
this Public License, then Your rights under this Public License
terminate automatically.
c. The disclaimer of warranties and limitation of liability provided
above shall be interpreted in a manner that, to the extent
possible, most closely approximates an absolute disclaimer and
waiver of all liability.
b. Where Your right to use the Licensed Material has terminated under
Section 6(a), it reinstates:
1. automatically as of the date the violation is cured, provided
it is cured within 30 days of Your discovery of the
violation; or
Section 6 -- Term and Termination.
2. upon express reinstatement by the Licensor.
a. This Public License applies for the term of the Copyright and
Similar Rights licensed here. However, if You fail to comply with
this Public License, then Your rights under this Public License
terminate automatically.
For the avoidance of doubt, this Section 6(b) does not affect any
right the Licensor may have to seek remedies for Your violations
of this Public License.
b. Where Your right to use the Licensed Material has terminated under
Section 6(a), it reinstates:
c. For the avoidance of doubt, the Licensor may also offer the
Licensed Material under separate terms or conditions or stop
distributing the Licensed Material at any time; however, doing so
will not terminate this Public License.
1. automatically as of the date the violation is cured, provided
it is cured within 30 days of Your discovery of the
violation; or
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
License.
2. upon express reinstatement by the Licensor.
For the avoidance of doubt, this Section 6(b) does not affect any
right the Licensor may have to seek remedies for Your violations
of this Public License.
Section 7 -- Other Terms and Conditions.
c. For the avoidance of doubt, the Licensor may also offer the
Licensed Material under separate terms or conditions or stop
distributing the Licensed Material at any time; however, doing so
will not terminate this Public License.
a. The Licensor shall not be bound by any additional or different
terms or conditions communicated by You unless expressly agreed.
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
License.
b. Any arrangements, understandings, or agreements regarding the
Licensed Material not stated herein are separate from and
independent of the terms and conditions of this Public License.
Section 7 -- Other Terms and Conditions.
Section 8 -- Interpretation.
a. The Licensor shall not be bound by any additional or different
terms or conditions communicated by You unless expressly agreed.
a. For the avoidance of doubt, this Public License does not, and
shall not be interpreted to, reduce, limit, restrict, or impose
conditions on any use of the Licensed Material that could lawfully
be made without permission under this Public License.
b. Any arrangements, understandings, or agreements regarding the
Licensed Material not stated herein are separate from and
independent of the terms and conditions of this Public License.
b. To the extent possible, if any provision of this Public License is
deemed unenforceable, it shall be automatically reformed to the
minimum extent necessary to make it enforceable. If the provision
cannot be reformed, it shall be severed from this Public License
without affecting the enforceability of the remaining terms and
conditions.
c. No term or condition of this Public License will be waived and no
failure to comply consented to unless expressly agreed to by the
Licensor.
Section 8 -- Interpretation.
d. Nothing in this Public License constitutes or may be interpreted
as a limitation upon, or waiver of, any privileges and immunities
that apply to the Licensor or You, including from the legal
processes of any jurisdiction or authority.
a. For the avoidance of doubt, this Public License does not, and
shall not be interpreted to, reduce, limit, restrict, or impose
conditions on any use of the Licensed Material that could lawfully
be made without permission under this Public License.
b. To the extent possible, if any provision of this Public License is
deemed unenforceable, it shall be automatically reformed to the
minimum extent necessary to make it enforceable. If the provision
cannot be reformed, it shall be severed from this Public License
without affecting the enforceability of the remaining terms and
conditions.
=======================================================================
c. No term or condition of this Public License will be waived and no
failure to comply consented to unless expressly agreed to by the
Licensor.
Creative Commons is not a party to its public
licenses. Notwithstanding, Creative Commons may elect to apply one of
its public licenses to material it publishes and in those instances
will be considered the “Licensor.” The text of the Creative Commons
public licenses is dedicated to the public domain under the CC0 Public
Domain Dedication. Except for the limited purpose of indicating that
material is shared under a Creative Commons public license or as
otherwise permitted by the Creative Commons policies published at
creativecommons.org/policies, Creative Commons does not authorize the
use of the trademark "Creative Commons" or any other trademark or logo
of Creative Commons without its prior written consent including,
without limitation, in connection with any unauthorized modifications
to any of its public licenses or any other arrangements,
understandings, or agreements concerning use of licensed material. For
the avoidance of doubt, this paragraph does not form part of the
public licenses.
d. Nothing in this Public License constitutes or may be interpreted
as a limitation upon, or waiver of, any privileges and immunities
that apply to the Licensor or You, including from the legal
processes of any jurisdiction or authority.
Creative Commons may be contacted at creativecommons.org.
=======================================================================
Creative Commons is not a party to its public
licenses. Notwithstanding, Creative Commons may elect to apply one of
its public licenses to material it publishes and in those instances
will be considered the "Licensor." The text of the Creative Commons
public licenses is dedicated to the public domain under the CC0 Public
Domain Dedication. Except for the limited purpose of indicating that
material is shared under a Creative Commons public license or as
otherwise permitted by the Creative Commons policies published at
creativecommons.org/policies, Creative Commons does not authorize the
use of the trademark "Creative Commons" or any other trademark or logo
of Creative Commons without its prior written consent including,
without limitation, in connection with any unauthorized modifications
to any of its public licenses or any other arrangements,
understandings, or agreements concerning use of licensed material. For
the avoidance of doubt, this paragraph does not form part of the
public licenses.
Creative Commons may be contacted at creativecommons.org.

View File

@ -2,7 +2,4 @@
My personal website, generated using [Hugo](https://gohugo.io)
## Discussions
Use [bobaforum](https://forum.bbaovanc.com) for questions, ideas, discussions,
etc. relating to me or my website.
It is live at https://bbaovanc.com.

121
assets/css/comments.css Normal file
View File

@ -0,0 +1,121 @@
/* Isso styling */
h4.isso-thread-heading {
color: var(--text-0);
margin-bottom: 8px;
}
.isso-comment:not(:first-of-type),
.isso-follow-up .isso-comment {
border-color: var(--background-3);
}
.isso-author,
.isso-page-author-suffix,
.isso-comment-footer,
.isso-comment-footer .isso-votes {
color: var(--text-gray-0);
}
.isso-comment-header .isso-spacer,
.isso-spacer:hover,
.isso-permalink,
.isso-permalink:hover {
color: var(--text-gray-1) !important;
}
a.isso-author:hover,
.isso-permalink:hover {
text-decoration: underline !important;
}
.isso-comment.isso-is-page-author > .isso-text-wrapper {
background-color: var(--background-accent-1);
}
.isso-feedlink:hover,
.isso-reply {
color: var(--link-0) !important;
text-shadow: unset !important;
}
.isso-reply:hover {
text-decoration: underline;
}
.isso-text pre,
.isso-text :not(pre) > code {
background-color: var(--background-2);
border: none;
padding: 2px 4px;
border-radius: 5px;
/* thanks isso.css for setting this to 85% for whatever reason */
font-size: 0.75em;
}
.isso-input-wrapper input,
.isso-post-action > input,
.isso-textarea,
.isso-preview {
color: var(--text-1);
background-color: var(--background-1);
border-color: var(--background-2) !important;
}
.isso-input-wrapper input:focus,
.isso-textarea:focus {
border-color: var(--background-3) !important;
}
.isso-post-action > input:hover {
background-color: var(--background-2);
}
.isso-post-action > input:focus,
.isso-post-action > input:active {
background-color: var(--background-3);
}
.isso-textarea {
margin-bottom: 4px;
}
.isso-input-wrapper {
display: inline-flex;
flex-direction: column;
margin-right: 4px;
max-width: 25%;
}
.isso-input-wrapper input {
order: 1;
}
.isso-input-wrapper label {
order: 2;
font-size: small;
}
.isso-post-action {
margin-left: 4px;
margin-top: 0;
}
@media screen and (max-width: 600px) {
.isso-input-wrapper {
display: block;
max-width: 100%;
}
}
@media print {
.comments {
break-before: always;
}
.isso-comment {
max-width: unset;
}
.isso-text-wrapper {
break-inside: avoid;
}
.isso-postbox,
.isso-feedlink {
display: none;
}
}
.isso-target {
animation: target-fade 10s ease-out; /* defined in bobatheme */
}

9
assets/css/search.css Normal file
View File

@ -0,0 +1,9 @@
/* put on body so it overrides the defaults set in :root by pagefind.css */
body {
/* https://pagefind.app/docs/ui-usage/#customising-the-styles */
--pagefind-ui-background: var(--background-1);
--pagefind-ui-border: var(--background-2);
--pagefind-ui-primary: var(--link-0);
--pagefind-ui-tag: var(--background-1);
--pagefind-ui-text: var(--text-1);
}

12
audit.sh Executable file
View File

@ -0,0 +1,12 @@
#!/bin/sh -x
# AUDIT flag already skips compression and search generation
HUGO_MINIFY_TDEWOLFF_HTML_KEEPCOMMENTS=true HUGO_ENABLEMISSINGTRANSLATIONPLACEHOLDERS=true hugo --buildDrafts --printI18nWarnings --printPathWarnings -d public.audit/
# https://gohugo.io/troubleshooting/audit/
! grep -inorE "<\!-- raw HTML omitted -->|ZgotmplZ|\[i18n\]|\(<nil>\)|(&lt;nil&gt;)|hahahugo" public.audit/
# see layouts/baseof.html in bobatheme
! grep -inorE "YUZSIQGHE" public.audit/
rm -r public.audit/

16
build.sh Executable file
View File

@ -0,0 +1,16 @@
#!/bin/bash -ex
# POSIX sh doesn't have the time command
[ -z "$DEST" ] && DEST="public/"
rm -rf "$DEST"
hugo --printI18nWarnings --printPathWarnings -d "$DEST" $@
if [ -z "$NO_SEARCH" ]; then
time pagefind --site "$DEST"
fi
if [ -z "$NO_COMPRESS" ]; then
export DEST
./compress.sh
fi

View File

@ -1,6 +1,12 @@
#!/bin/sh
#!/bin/bash
# POSIX sh does not have time command so we must use bash
files=$(find public/ -name "*.html" -o -name "*.xml" -o -name "*.css" -o -name "*.js" -o -name "*.svg")
[ -z "$DEST" ] && echo "Please provide DEST variable for compress.sh" && exit 1
printf '%s\n' "$files" | parallel $@ "echo 'GZIP {}' && gzip -fnk {}"
printf '%s\n' "$files" | parallel $@ "echo 'BROTLI {}' && brotli -fZk {}"
files=$(find "$DEST" -name "*.html" -o -name "*.xml" -o -name "*.css" -o -name "*.js" -o -name "*.svg")
time printf '%s\n' "$files" | parallel $@ "echo 'GZIP {}' && gzip -fnk {}"
time printf '%s\n' "$files" | parallel $@ "echo 'BROTLI {}' && brotli -fZk {}"
# level 9 chosen based on `zstd -b1 -e22 public/blog/swapfile-guide/index.html`
# gives a slightly better ratio than default (3)
time printf '%s\n' "$files" | parallel $@ "echo 'ZSTD {}' && zstd -q -f -9 {}"

431
content/LICENSE Normal file
View File

@ -0,0 +1,431 @@
As stated in /LICENSE at the root of this repository, my website's
content is licensed under CC-BY-SA 4.0:
Attribution-ShareAlike 4.0 International
=======================================================================
Creative Commons Corporation ("Creative Commons") is not a law firm and
does not provide legal services or legal advice. Distribution of
Creative Commons public licenses does not create a lawyer-client or
other relationship. Creative Commons makes its licenses and related
information available on an "as-is" basis. Creative Commons gives no
warranties regarding its licenses, any material licensed under their
terms and conditions, or any related information. Creative Commons
disclaims all liability for damages resulting from their use to the
fullest extent possible.
Using Creative Commons Public Licenses
Creative Commons public licenses provide a standard set of terms and
conditions that creators and other rights holders may use to share
original works of authorship and other material subject to copyright
and certain other rights specified in the public license below. The
following considerations are for informational purposes only, are not
exhaustive, and do not form part of our licenses.
Considerations for licensors: Our public licenses are
intended for use by those authorized to give the public
permission to use material in ways otherwise restricted by
copyright and certain other rights. Our licenses are
irrevocable. Licensors should read and understand the terms
and conditions of the license they choose before applying it.
Licensors should also secure all rights necessary before
applying our licenses so that the public can reuse the
material as expected. Licensors should clearly mark any
material not subject to the license. This includes other CC-
licensed material, or material used under an exception or
limitation to copyright. More considerations for licensors:
wiki.creativecommons.org/Considerations_for_licensors
Considerations for the public: By using one of our public
licenses, a licensor grants the public permission to use the
licensed material under specified terms and conditions. If
the licensor's permission is not necessary for any reason--for
example, because of any applicable exception or limitation to
copyright--then that use is not regulated by the license. Our
licenses grant only permissions under copyright and certain
other rights that a licensor has authority to grant. Use of
the licensed material may still be restricted for other
reasons, including because others have copyright or other
rights in the material. A licensor may make special requests,
such as asking that all changes be marked or described.
Although not required by our licenses, you are encouraged to
respect those requests where reasonable. More considerations
for the public:
wiki.creativecommons.org/Considerations_for_licensees
=======================================================================
Creative Commons Attribution-ShareAlike 4.0 International Public
License
By exercising the Licensed Rights (defined below), You accept and agree
to be bound by the terms and conditions of this Creative Commons
Attribution-ShareAlike 4.0 International Public License ("Public
License"). To the extent this Public License may be interpreted as a
contract, You are granted the Licensed Rights in consideration of Your
acceptance of these terms and conditions, and the Licensor grants You
such rights in consideration of benefits the Licensor receives from
making the Licensed Material available under these terms and
conditions.
Section 1 -- Definitions.
a. Adapted Material means material subject to Copyright and Similar
Rights that is derived from or based upon the Licensed Material
and in which the Licensed Material is translated, altered,
arranged, transformed, or otherwise modified in a manner requiring
permission under the Copyright and Similar Rights held by the
Licensor. For purposes of this Public License, where the Licensed
Material is a musical work, performance, or sound recording,
Adapted Material is always produced where the Licensed Material is
synched in timed relation with a moving image.
b. Adapter's License means the license You apply to Your Copyright
and Similar Rights in Your contributions to Adapted Material in
accordance with the terms and conditions of this Public License.
c. BY-SA Compatible License means a license listed at
creativecommons.org/compatiblelicenses, approved by Creative
Commons as essentially the equivalent of this Public License.
d. Copyright and Similar Rights means copyright and/or similar rights
closely related to copyright including, without limitation,
performance, broadcast, sound recording, and Sui Generis Database
Rights, without regard to how the rights are labeled or
categorized. For purposes of this Public License, the rights
specified in Section 2(b)(1)-(2) are not Copyright and Similar
Rights.
e. Effective Technological Measures means those measures that, in the
absence of proper authority, may not be circumvented under laws
fulfilling obligations under Article 11 of the WIPO Copyright
Treaty adopted on December 20, 1996, and/or similar international
agreements.
f. Exceptions and Limitations means fair use, fair dealing, and/or
any other exception or limitation to Copyright and Similar Rights
that applies to Your use of the Licensed Material.
g. License Elements means the license attributes listed in the name
of a Creative Commons Public License. The License Elements of this
Public License are Attribution and ShareAlike.
h. Licensed Material means the artistic or literary work, database,
or other material to which the Licensor applied this Public
License.
i. Licensed Rights means the rights granted to You subject to the
terms and conditions of this Public License, which are limited to
all Copyright and Similar Rights that apply to Your use of the
Licensed Material and that the Licensor has authority to license.
j. Licensor means the individual(s) or entity(ies) granting rights
under this Public License.
k. Share means to provide material to the public by any means or
process that requires permission under the Licensed Rights, such
as reproduction, public display, public performance, distribution,
dissemination, communication, or importation, and to make material
available to the public including in ways that members of the
public may access the material from a place and at a time
individually chosen by them.
l. Sui Generis Database Rights means rights other than copyright
resulting from Directive 96/9/EC of the European Parliament and of
the Council of 11 March 1996 on the legal protection of databases,
as amended and/or succeeded, as well as other essentially
equivalent rights anywhere in the world.
m. You means the individual or entity exercising the Licensed Rights
under this Public License. Your has a corresponding meaning.
Section 2 -- Scope.
a. License grant.
1. Subject to the terms and conditions of this Public License,
the Licensor hereby grants You a worldwide, royalty-free,
non-sublicensable, non-exclusive, irrevocable license to
exercise the Licensed Rights in the Licensed Material to:
a. reproduce and Share the Licensed Material, in whole or
in part; and
b. produce, reproduce, and Share Adapted Material.
2. Exceptions and Limitations. For the avoidance of doubt, where
Exceptions and Limitations apply to Your use, this Public
License does not apply, and You do not need to comply with
its terms and conditions.
3. Term. The term of this Public License is specified in Section
6(a).
4. Media and formats; technical modifications allowed. The
Licensor authorizes You to exercise the Licensed Rights in
all media and formats whether now known or hereafter created,
and to make technical modifications necessary to do so. The
Licensor waives and/or agrees not to assert any right or
authority to forbid You from making technical modifications
necessary to exercise the Licensed Rights, including
technical modifications necessary to circumvent Effective
Technological Measures. For purposes of this Public License,
simply making modifications authorized by this Section 2(a)
(4) never produces Adapted Material.
5. Downstream recipients.
a. Offer from the Licensor -- Licensed Material. Every
recipient of the Licensed Material automatically
receives an offer from the Licensor to exercise the
Licensed Rights under the terms and conditions of this
Public License.
b. Additional offer from the Licensor -- Adapted Material.
Every recipient of Adapted Material from You
automatically receives an offer from the Licensor to
exercise the Licensed Rights in the Adapted Material
under the conditions of the Adapter's License You apply.
c. No downstream restrictions. You may not offer or impose
any additional or different terms or conditions on, or
apply any Effective Technological Measures to, the
Licensed Material if doing so restricts exercise of the
Licensed Rights by any recipient of the Licensed
Material.
6. No endorsement. Nothing in this Public License constitutes or
may be construed as permission to assert or imply that You
are, or that Your use of the Licensed Material is, connected
with, or sponsored, endorsed, or granted official status by,
the Licensor or others designated to receive attribution as
provided in Section 3(a)(1)(A)(i).
b. Other rights.
1. Moral rights, such as the right of integrity, are not
licensed under this Public License, nor are publicity,
privacy, and/or other similar personality rights; however, to
the extent possible, the Licensor waives and/or agrees not to
assert any such rights held by the Licensor to the limited
extent necessary to allow You to exercise the Licensed
Rights, but not otherwise.
2. Patent and trademark rights are not licensed under this
Public License.
3. To the extent possible, the Licensor waives any right to
collect royalties from You for the exercise of the Licensed
Rights, whether directly or through a collecting society
under any voluntary or waivable statutory or compulsory
licensing scheme. In all other cases the Licensor expressly
reserves any right to collect such royalties.
Section 3 -- License Conditions.
Your exercise of the Licensed Rights is expressly made subject to the
following conditions.
a. Attribution.
1. If You Share the Licensed Material (including in modified
form), You must:
a. retain the following if it is supplied by the Licensor
with the Licensed Material:
i. identification of the creator(s) of the Licensed
Material and any others designated to receive
attribution, in any reasonable manner requested by
the Licensor (including by pseudonym if
designated);
ii. a copyright notice;
iii. a notice that refers to this Public License;
iv. a notice that refers to the disclaimer of
warranties;
v. a URI or hyperlink to the Licensed Material to the
extent reasonably practicable;
b. indicate if You modified the Licensed Material and
retain an indication of any previous modifications; and
c. indicate the Licensed Material is licensed under this
Public License, and include the text of, or the URI or
hyperlink to, this Public License.
2. You may satisfy the conditions in Section 3(a)(1) in any
reasonable manner based on the medium, means, and context in
which You Share the Licensed Material. For example, it may be
reasonable to satisfy the conditions by providing a URI or
hyperlink to a resource that includes the required
information.
3. If requested by the Licensor, You must remove any of the
information required by Section 3(a)(1)(A) to the extent
reasonably practicable.
b. ShareAlike.
In addition to the conditions in Section 3(a), if You Share
Adapted Material You produce, the following conditions also apply.
1. The Adapter's License You apply must be a Creative Commons
license with the same License Elements, this version or
later, or a BY-SA Compatible License.
2. You must include the text of, or the URI or hyperlink to, the
Adapter's License You apply. You may satisfy this condition
in any reasonable manner based on the medium, means, and
context in which You Share Adapted Material.
3. You may not offer or impose any additional or different terms
or conditions on, or apply any Effective Technological
Measures to, Adapted Material that restrict exercise of the
rights granted under the Adapter's License You apply.
Section 4 -- Sui Generis Database Rights.
Where the Licensed Rights include Sui Generis Database Rights that
apply to Your use of the Licensed Material:
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
to extract, reuse, reproduce, and Share all or a substantial
portion of the contents of the database;
b. if You include all or a substantial portion of the database
contents in a database in which You have Sui Generis Database
Rights, then the database in which You have Sui Generis Database
Rights (but not its individual contents) is Adapted Material,
including for purposes of Section 3(b); and
c. You must comply with the conditions in Section 3(a) if You Share
all or a substantial portion of the contents of the database.
For the avoidance of doubt, this Section 4 supplements and does not
replace Your obligations under this Public License where the Licensed
Rights include other Copyright and Similar Rights.
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
c. The disclaimer of warranties and limitation of liability provided
above shall be interpreted in a manner that, to the extent
possible, most closely approximates an absolute disclaimer and
waiver of all liability.
Section 6 -- Term and Termination.
a. This Public License applies for the term of the Copyright and
Similar Rights licensed here. However, if You fail to comply with
this Public License, then Your rights under this Public License
terminate automatically.
b. Where Your right to use the Licensed Material has terminated under
Section 6(a), it reinstates:
1. automatically as of the date the violation is cured, provided
it is cured within 30 days of Your discovery of the
violation; or
2. upon express reinstatement by the Licensor.
For the avoidance of doubt, this Section 6(b) does not affect any
right the Licensor may have to seek remedies for Your violations
of this Public License.
c. For the avoidance of doubt, the Licensor may also offer the
Licensed Material under separate terms or conditions or stop
distributing the Licensed Material at any time; however, doing so
will not terminate this Public License.
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
License.
Section 7 -- Other Terms and Conditions.
a. The Licensor shall not be bound by any additional or different
terms or conditions communicated by You unless expressly agreed.
b. Any arrangements, understandings, or agreements regarding the
Licensed Material not stated herein are separate from and
independent of the terms and conditions of this Public License.
Section 8 -- Interpretation.
a. For the avoidance of doubt, this Public License does not, and
shall not be interpreted to, reduce, limit, restrict, or impose
conditions on any use of the Licensed Material that could lawfully
be made without permission under this Public License.
b. To the extent possible, if any provision of this Public License is
deemed unenforceable, it shall be automatically reformed to the
minimum extent necessary to make it enforceable. If the provision
cannot be reformed, it shall be severed from this Public License
without affecting the enforceability of the remaining terms and
conditions.
c. No term or condition of this Public License will be waived and no
failure to comply consented to unless expressly agreed to by the
Licensor.
d. Nothing in this Public License constitutes or may be interpreted
as a limitation upon, or waiver of, any privileges and immunities
that apply to the Licensor or You, including from the legal
processes of any jurisdiction or authority.
=======================================================================
Creative Commons is not a party to its public
licenses. Notwithstanding, Creative Commons may elect to apply one of
its public licenses to material it publishes and in those instances
will be considered the "Licensor." The text of the Creative Commons
public licenses is dedicated to the public domain under the CC0 Public
Domain Dedication. Except for the limited purpose of indicating that
material is shared under a Creative Commons public license or as
otherwise permitted by the Creative Commons policies published at
creativecommons.org/policies, Creative Commons does not authorize the
use of the trademark "Creative Commons" or any other trademark or logo
of Creative Commons without its prior written consent including,
without limitation, in connection with any unauthorized modifications
to any of its public licenses or any other arrangements,
understandings, or agreements concerning use of licensed material. For
the avoidance of doubt, this paragraph does not form part of the
public licenses.
Creative Commons may be contacted at creativecommons.org.

View File

@ -19,6 +19,16 @@ I occasionally write blog posts under the [blog section][blog-section].
[hugo-website]: https://gohugo.io
[blog-section]: {{< ref "/blog/" >}}
## Contact
You can contact me by emailing bbaovanc@bbaovanc.com ([PGP key][pgp-key] if
encryption is needed), or on Mastodon at
[bbaovanc@procursus.social][mastodon-account] (but I have some plans to
replace Mastodon... stay tuned).
[pgp-key]: https://keyserver.ubuntu.com/pks/lookup?search=bbaovanc%40bbaovanc.com&fingerprint=on&op=index
[mastodon-account]: https://procursus.social/@bbaovanc
## Topics I write about
I write mostly about technology, including:
@ -27,7 +37,3 @@ I write mostly about technology, including:
- Open Source Software
- Programming
- Web Development
## My other website
I also run another website: https://boba.best.

View File

@ -0,0 +1,8 @@
---
title: Authors
description: >-
List of authors on my website.
---

View File

@ -1,6 +1,6 @@
---
title: Github Copilot
title: GitHub Copilot
---

View File

@ -3,6 +3,6 @@
title: Blog
description: >-
The home of my blog.
The home of my blog. This is where all my articles go under.
---

View File

@ -9,15 +9,11 @@ comments: true
authors:
- bbaovanc
aliases:
- posts/allow-non-root-processes-to-bind-to-privileged-ports/
categories:
- guides
- linux
tags:
- gitea
- linux
- systemd
---

View File

@ -2,7 +2,7 @@
title: Using GitHub Actions to audit my website with Google Chrome Lighthouse
date: 2022-05-07T00:54:11-05:00
lastmod: 2022-05-07T00:54:11-05:00
lastmod: 2022-05-08T16:16:02-05:00
toc: true
comments: true
@ -10,11 +10,11 @@ authors:
- bbaovanc
categories:
- devops
- meta
tags:
- caddy
- devops
- github-actions
- google-lighthouse

View File

@ -2,7 +2,7 @@
title: Newsletter for my blog posts
date: 2022-04-30T01:00:14-05:00
lastmod: 2022-04-30T01:00:14-05:00
lastmod: 2022-05-23T02:17:47-05:00
toc: true
comments: true
@ -13,10 +13,6 @@ categories:
- meta
tags:
- bobanews
- listmonk
- mailing-list
- newsletter
# this will be shown for the article in list pages and in the page metadata
# it can be either an image or video (this might change in the future, however)
@ -38,6 +34,11 @@ notifications when I post new ones, so I have more than just an RSS feed.
<!--more-->
{{< aside warning >}}
I decided that I didn't really want to deal with the extra work of managing a
newsletter so I've removed it. (I didn't actually get any sign-ups).
{{< /aside >}}
**See the ["Signing Up" section]({{< ref "#signing-up" >}}) for instructions on
how to sign up for the newsletter.**
@ -74,6 +75,11 @@ website uses. Here's a screenshot of how it currently looks:
## Signing up
{{< aside warning >}}
I decided that I didn't really want to deal with the extra work of managing a
newsletter so I've removed it. (I didn't actually get any sign-ups anyways.)
{{< /aside >}}
You can sign up to get emails about new posts on the [newsletter signup form
here](https://lists.bbaovanc.com/subscription/form). Make sure the box next to
the list labeled `bbaovanc.com Blog Posts` is checked. You'll need to provide an

View File

@ -2,7 +2,7 @@
title: Caddy is literally the best webserver
date: 2021-11-13T00:43:35-06:00
lastmod: 2022-05-02T00:54:43-05:00
lastmod: 2023-01-16T20:57:00-06:00
toc: true
comments: true
@ -10,12 +10,12 @@ authors:
- bbaovanc
categories:
- linux
- sysadmin
- software
- reviews
tags:
- caddy
- linux
- sysadmin
- webserver
resources:
@ -95,9 +95,9 @@ configs.
### PHP (PrivateBin)
The Caddy config for this example is the same as the [one used for
bin.boba.best](https://git.boba.best/configs/caddy/src/commit/cd00151fbdd784979a8a181980cc36061be68c7d/conf.d/bin.boba.best).
bin.boba.best](https://git.boba.best/boba.best/caddy/src/commit/cd00151fbdd784979a8a181980cc36061be68c7d/conf.d/bin.boba.best).
I've stripped it down a bit by removing the [custom error
pages](https://git.boba.best/configs/caddy/src/commit/cd00151fbdd784979a8a181980cc36061be68c7d/Caddyfile#L15-L24),
pages](https://git.boba.best/boba.best/caddy/src/commit/cd00151fbdd784979a8a181980cc36061be68c7d/Caddyfile#L15-L24),
[HSTS](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security), [zstd
compression](https://github.com/facebook/zstd), and logging.
@ -137,7 +137,7 @@ server {
### Reverse proxy + static files (Gitea)
This last example is based on
[git.bbaovanc.com](https://git.bbaovanc.com/configs/caddy/src/commit/57c9f0011eae92ef5fa2992d99f01b0956802d64/conf.d/git.bbaovanc.com).
[git.bbaovanc.com](https://git.bbaovanc.com/boba.best/caddy/src/commit/57c9f0011eae92ef5fa2992d99f01b0956802d64/conf.d/git.bbaovanc.com).
Just like the last example, I've stripped off the custom error pages, HSTS, zstd
compression, and logging.
@ -204,7 +204,7 @@ entirely using Caddy's and Go templates![^caddy-templating]
#### Error pages using HTTP Cats
I use [this
snippet](https://git.bbaovanc.com/configs/caddy/src/commit/57c9f0011eae92ef5fa2992d99f01b0956802d64/Caddyfile#L8-L15)
snippet](https://git.bbaovanc.com/boba.best/caddy/src/commit/57c9f0011eae92ef5fa2992d99f01b0956802d64/Caddyfile#L8-L15)
on both bbaovanc.com and boba.best to make custom error pages using images from
[HTTP Cats](https://http.cat). It uses Caddy's template support to generate some
simple HTML to show the error code, name, and cat image.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -9,17 +9,11 @@ comments: true
authors:
- bbaovanc
aliases:
- posts/checkra1n-gui-on-other-distros/
categories:
- guides
- jailbreak
- linux
tags:
- arch-linux
- checkra1n
- linux
resources:
- name: feature

View File

@ -2,14 +2,13 @@
# this is the title it generated. not even joking
title: Copilot
date: 2021-11-07T16:17:15-06:00
lastmod: 2021-11-07T16:17:15-06:00
date: 2021-11-07T16:20:15-06:00
lastmod: 2021-11-07T16:20:15-06:00
toc: true
comments: true
authors:
- GitHub Copilot
- bbaovanc
categories:
@ -19,6 +18,9 @@ tags:
series:
- github-copilot-experiments
_build:
list: never
---
Did you know that Copilot is a command line interface for Copilot? It's a tool

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

View File

@ -0,0 +1,297 @@
---
title: How the "Discord sex" (`s/e/x`) hack works
date: 2022-05-11T21:11:17-05:00
lastmod: 2022-09-24T14:56:05-05:00
toc: true
comments: true
authors:
- bbaovanc
categories:
- tips-and-tricks
tags:
- discord
- discord-tricks
- sed
# this will be shown for the article in list pages and in the page metadata
# it can be either an image or video (this might change in the future, however)
resources:
- name: feature
src: example.webp
title: Result after sending a GIF and then sending `s/e/x`.
- name: default-sex
src: default-sex.webp
title: Fallback image on `txnor.com`
- name: double-sex
src: double-sex.webp
title: Resulting image after typing `s/e/x` a second time.
- name: chess
src: chess.webp
title: This happens once you type `s/w/ag` after having done `s/e/x`.
- name: sword
src: sword.webp
title: This happens when you type `s/w/ord` after having done `s/e/x`.
- name: sword-atk
src: sword-atk.webp
title: This happens when you type `s/d/dATK`
- name: sword-def
src: sword-def.webp
title: This happens when you type `s/d/dDEF`
- name: sword-hug
src: sword-hug.webp
title: This happens when you type `s/d/dHUG`
- name: sword-win
src: sword-win.webp
title: Win screen on the `s/w/ord` game.
- name: sword-lose
src: sword-lose.webp
title: Lose screen on the `s/w/ord` game.
- name: 6969th
src: 6969th.webp
title: This happens on average (since it's randomized) every 6070th use.
- name: math-challenge
src: math-challenge.webp
title: Math challenge example
---
There's this trick going around on Discord recently where if you send any GIF
from Tenor, and then type `s/e/x`, then it turns it into a different meme GIF.
Here's how it works.
<!--more-->
{{< aside info >}}
Credit goes to Rebane2001 (not me) for making this trick, and setting it up on
`txnor.com`.
{{< /aside >}}
## The `sed` syntax
For operating systems based on Unix or Linux, there's usually a simple terminal
command included called [`sed`][sed-wikipedia], which is most commonly used to
run text replacement commands. Here's a very simple example of what a basic
`sed` command looks like:
[sed-wikipedia]: https://en.wikipedia.org/wiki/Sed
```console
$ sed 's/hello/goodbye/'
```
Discord likely implemented this in order to appeal to
[IRC][irc-wikipedia][^irc-definition] users. Since IRC doesn't support editing
messages, it's common for people to send messages in that format to tell people
about changes to their previous message. Discord implemented this into both
their web/desktop client and their iOS app, excluding the Android app.
[irc-wikipedia]: https://en.wikipedia.org/wiki/Internet_Relay_Chat
[^irc-definition]: IRC (Internet Relay Chat) is a simple text-based chat system.
It's a very old protocol, however its simplicity and minimalism is the main
reason people choose it. It's not very popular anymore.
Note that while real `sed` commands can get much more complicated, Discord's
implementation doesn't support those advanced features[^trailing-slash-note].
[^trailing-slash-note]: Also note that in Discord's implementation, the trailing
slash (after `goodbye`) can be ommitted (making it just `s/hello/goodbye`),
but with the real `sed` command, it's required.
{{< see-also "/blog/text-substitution-in-discord-using-sed" >}}
## What does `s/e/x` do?
When you send a GIF using the GIF picker on Discord, it actually sends the link
to the GIF, which is served by [Tenor][tenor-website]. For example, here's a GIF
sent from Tenor:
[tenor-website]: https://tenor.com
https://tenor.com/view/cat-massage-gif-24282757
Running `s/e/x` will take the first occurrence of `e` and replace it with `x`.
The link becomes the following (notice the bolded letter `x`):
[https://t**x**nor.com/view/cat-massage-gif-24282757][example-1]
[example-1]: https://txnor.com/view/cat-massage-gif-24282757
Then, all that's left to do is to buy the domain `txnor.com`, and write a simple
program to run on it. In fact, it looks like that domain was purchased purely in
order to make this trick possible[^txnor-domain-date].
[^txnor-domain-date]: According to [a quick WHOIS lookup][txnor-whois], the
domain was registered on May 3, 2022. That's the same day that [@Rebane
tweeted about the new feature][rebane-tweet] (~~going to https://txnor.com
redirects to this tweet~~ now the domain redirects to [Rebane's YouTube video
about the hack]({{< ref "#youtube-video" >}})), so I assume that this is the
only reason they bought the domain.
[txnor-whois]: https://www.whois.com/whois/txnor.com
[rebane-tweet]: https://twitter.com/rebane2001/status/1521544722875142145
## How does it display on Discord without redirecting?
When viewing any of the URLs on `txnor.com` in a normal web browser, you get
[redirected to a tweet][rebane-tweet]. However, Discord is able to display the
image without being redirected.
When Discord loads a website to generate an embed, it uses a user
agent[^user-agent-definition] (which is a little piece of text which tells the
server what your browser is) which looks something like this:
[^user-agent-definition]: If you actually care, there's a [Wikipedia
article](https://en.wikipedia.org/wiki/User_agent), and a [page on
WhatIsMyIPAddress.com](https://whatismyipaddress.com/user-agent) which also
explain what a user agent is.
```text
User-Agent: Mozilla/5.0 (compatible; Discordbot/2.0; +https://discordapp.com/)
```
The important part here is the word `Discord`. If you visit the website with
your user agent set to anything containing `Discord`
(case-insensitive)[^discord-user-agent], then it serves the image directly.
[^discord-user-agent]: [According to the source code][user-agent-source-code],
it looks like `Intel Mac OS X 11.6; rv:92.0` also triggers the same response.
[user-agent-source-code]: https://github.com/rebane2001/txnor-server/blob/26c7c279b0b4668c8a3b061692d83c507aeac7c5/txnor.nginx#L23-L27
## Default image
If you go to any URL on `txnor.com` that doesn't fit one of the existing
patterns/games, then it returns this fallback image:
{{< figure src="default-sex" >}}
## Extra features
### Double sex
If you then run `s/e/x` a second time, then it changes to a different image:
{{< figure src="double-sex" >}}
This works in a simple way as well. The next `e` that appears in the URL is
inside `/view/`. So, after typing `s/e/x` a second time, the URL becomes:
[https://txnor.com/vi**x**w/cat-massage-gif-24282757][example-2]
[example-2]: https://txnor.com/vixw/cat-massage-gif-24282757
### Chess (`s/w/ag`)
Another cool feature is that you can play chess by typing `s/w/ag` after typing
the initial message of `s/e/x`.
{{< figure src="chess" >}}
### `s/w/ord`
If you do `s/w/ord` after `s/e/x`, then it starts a fighting game (titled
"Wumpagotchi Adventures". You can use three commands: s/d/d**ATK**,
s/d/d**DEF**, and s/d/d**HUG**.
Here are a few example images:
#### Main `s/w/ord` screen
{{< figure src="sword" >}}
#### ATK command
{{< figure src="sword-atk" >}}
#### DEF command
{{< figure src="sword-def" >}}
#### HUG command
{{< figure src="sword-hug" >}}
#### Win screen
{{< figure src="sword-win" >}}
#### Lose screen
{{< figure src="sword-lose" >}}
### 6969th Discord Sexer
If you happen to get a one in 6970 chance, it will instead return
a special image:
{{< figure src="6969th" >}}
[6969th-source]: https://github.com/rebane2001/txnor-server/blob/26c7c279b0b4668c8a3b061692d83c507aeac7c5/sex.py#L130-L133
Here's a [snippet of the code that handles this chance][6969th-source]:
```python
# 6969th winner image (disable for chess)
if random.randint(0, 6969) == 6969 and "ag" not in name:
web.header('Cache-Control', 'no-store')
return six_nine
```
I believe it's supposed to be a 1/6969 chance, but `random.randint` in Python
[includes both numbers][randint-inclusive]. That means that the possible numbers that it could pick
would be 0, 1, ... 6968, 6969. If you were to count the numbers included in that
sequence, it would total 6970.
[randint-inclusive]: https://docs.python.org/3/library/random.html#random.randint
### Math challenge
Any URL that matches [this regular expression][math-challenge-regex] will
instead return a randomized math challenge. This means the URL can be
`https://txnor.com/` followed by either `math`, `math_challenge`, or
`mathchallenge`, a single optional slash, and then any text that's made up of
only letters, numbers, underscores or hyphens.
[math-challenge-regex]: https://regex101.com/r/ddEkML/1
{{< figure src="math-challenge" >}}
What's special is that the math challenge is [set to not be
cached][math-challenge-caching]. That means that it
*should*[^should-different-question] give everyone a different question.
[math-challenge-caching]: https://github.com/rebane2001/txnor-server/blob/26c7c279b0b4668c8a3b061692d83c507aeac7c5/sex.py#L137
[^should-different-question]: The caching behavior seems to be inconsistent, so
sometimes it does end up giving multiple people the same question.
How it works is that when each person's Discord client sends a request to the
Discord CDN to get the image, the client caches that image. That means each
client will see the same challenge problem, even if the user restarts the
client. But separate clients will not have it cached, so they'll request it
again themselves, and different numbers will be generated.
## Discord sex is open source
Thanks to a [comment from Rebane on this post](#isso-16), I now know that the
server running on `txnor.com` is open source. See
[rebane2001/txnor-server][txnor-server-github].
[txnor-server-github]: https://github.com/rebane2001/txnor-server
## YouTube video
Rebane also [made a YouTube video][txnor-youtube-video] about this trick. Make
sure to check it out too!
[txnor-youtube-video]: https://www.youtube.com/watch?v=km8CR-fdB7o

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -2,16 +2,13 @@
title: How to put `(edited)` in the middle of a message in Discord
date: 2021-03-25T18:48:34-05:00
lastmod: 2022-04-08T23:29:41-05:00
lastmod: 2022-12-06T19:59:22-06:00
toc: true
comments: true
authors:
- bbaovanc
aliases:
- posts/edited-in-middle-of-message-discord/
categories:
- guides
- tips-and-tricks
@ -35,6 +32,11 @@ to any location inside the message.
<!--more-->
{{< aside note >}}
This trick only works if you're on desktop/web, and will also only show to
people on desktop/web.
{{< /aside >}}
## Tutorial
Before you start, copy the "right-to-left embedding" character

View File

@ -10,11 +10,11 @@ authors:
- bbaovanc
categories:
- programming
- tinkering
- experiments
tags:
- github-copilot
- programming
series:
- github-copilot-experiments

View File

@ -0,0 +1,251 @@
---
title: How to create (or remove) a swapfile on Linux
date: 2023-04-04T17:26:44-05:00
lastmod: 2023-04-04T17:26:44-05:00
toc: true
comments: true
authors:
- bbaovanc
categories:
- guides
- tips-and-tricks
tags:
- linux
- linux-swap
- swapfile
---
A step-by-step tutorial on how to create or remove a swapfile on a Linux
machine, and how to decide if you need one.
<!--more-->
## Should you use swap?
A common misconception is that adding swap to your system can reduce
performance. However, even if you aren't running out of RAM, it can still be
beneficial to add swap.
See these points according to [an article by Hayden James][always-add-swap]:
> - Even if there is still available RAM, the Linux Kernel will **move memory
> pages that are hardly ever used** into swap space.
>
> - Its better to swap out memory pages that have been inactive for a while,
> **keeping often-used data in cache**, and this should happen when the server
> is most idle, which is the aim of the Kernel.
>
> - Avoid setting your swap space too large if it will result in prolonging
> performance issues, outages, or your response time (without proper
> monitoring/alerts).
[always-add-swap]: https://haydenjames.io/linux-performance-almost-always-add-swap-space/
### Should you use a swap file or partition?
Swap partitions should be preferred because swapfiles tend to be slower and
slightly more complex to set up, especially if hibernating. A swapfile might be
preferred due to its flexibility (ease to resize), but if you use
[LVM][lvm-archwiki] then you can easily resize the swap partition anyways.
[lvm-archwiki]: https://wiki.archlinux.org/title/LVM
## Tutorial
{{% include "snippets/console.md" %}}
### Step 1: Create the file
The first step is to allocate the file.
```console
# dd if=/dev/zero of=/swapfile bs=1M count=[size in MiB] status=progress
```
Replace `[size in MiB]` with the size of your swapfile in Mebibytes (MiB). You
can use [this online converter](https://www.convertunits.com/from/GiB/to/MiB) to
convert from Gibibytes (GiB, often confused with Gigabytes, but that's a
misconception for another time) to MiB, which you can put in the command.
Or you can look at this table for common sizes:
| GiB | MiB |
|-----|-------------|
| 1 | count=1024 |
| 2 | count=2048 |
| 3 | count=3072 |
| 4 | count=4096 |
| 8 | count=8192 |
| 16 | count=16384 |
{.simple}
If you aren't sure how big your swapfile should be, take a look at [Table 15.1
on this Red Hat documentation page][redhat-swap-table]. Remember that if your
first swapfile isn't large enough, you can create another one.
[redhat-swap-table]: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/storage_administration_guide/ch-swapspace#tb-recommended-system-swap-space
On my computer I have 32 GiB of RAM and a 16 GiB swap partition, rather than
swapfile, because I can flexibly expand the swap partition using
[LVM][lvm-archwiki].
{{< aside example >}}
To create a swapfile 4 GiB in size, you would run:
```console
# dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB, 4.0 GiB) copied, 0.960183 s, 4.5 GB/s
```
{{< /aside >}}
### Step 2: Change swapfile permissions
The swapfile should only be readable by the system (`root` user). Run this
command to change it:
```console
# chmod 600 /swapfile
```
### Step 3: Format the swapfile
Use the `mkswap` command to format the file to be used as swap (basically just
add a header to identify it):
```console
# mkswap /swapfile
Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)
no label, UUID=a0b87eca-b951-4344-be2d-020d77cdef48
```
### Step 4: Create an entry in `/etc/fstab`
An entry needs to be added to `/etc/fstab` for the swapfile to be enabled during
bootup. Open `/etc/fstab` in a text editor, and add this line to the end (add
spaces to line up with other entries if you want, whitespace is ignored):
```text
/swapfile none swap sw 0 0
```
{{< aside note >}}
Above, I have filled the "options" field with `sw`. Some guides suggest using
either `sw` or `defaults`. Neither of those options is valid for `swapon` and
they are both ignored. However, the field does need to be filled out with
something, so feel free to put something funny (do let me know in the comments
if this somehow breaks something though).
If you're curious, this is my `fstab` entry (`UUID` is because I use a swap
partition, rather than swapfile):
```text
# /dev/mapper/bobavg0-swap
UUID=4f7c3ae8-839b-4474-b8a5-96bd78db06f8 none swap bobaswap 0 0
```
{{< /aside >}}
### Step 5: Enable the swapfile
Adding the `fstab` entry won't enable the swapfile until a reboot. To enable it
now, use the `swapon` command.
```console
# swapon /swapfile
```
### Finally: check the swap status
Use `swapon` and `free` to verify that your new swapfile has been added:
```console
$ swapon --show
NAME TYPE SIZE USED PRIO
/swapfile file 4G 0B -2
$ free -h
total used free shared buff/cache available
Mem: 31Gi 3.6Gi 20Gi 233Mi 6.9Gi 26Gi
Swap: 4.0Gi 0B 4.0Gi
```
{{< aside note >}}
If you get an error saying that the `swapon` command was not found, try running
it as `root` (using `sudo`). On Debian-based distributions the `swapon` command
is not available to regular users.
```console
$ swapon --show
bash: swapon: command not found
# swapon --show
NAME TYPE SIZE USED PRIO
/swapfile file 4G 0B -2
```
{{< /aside >}}
## Removing a swapfile
{{< aside warning >}}
Be careful that the swapfile isn't being highly used because once you run
`swapoff`, it will dump the entire contents back into RAM and may cause you to
run out of memory.
{{< /aside >}}
### Step 1: Disable/unload the swapfile
```console
$ swapon --show
NAME TYPE SIZE USED PRIO
/swapfile file 4G 0B -2
$ # the path to the swapfile I want to remove is `/swapfile`
# swapoff /swapfile
```
### Step 2: Remove the entry from `fstab`
Open `/etc/fstab` in a text editor and find the line matching the swapfile you
want to remove, and delete it. For example:
```text
/swapfile none swap sw 0 0
```
### Step 3: Delete the actual file
```console
# rm /swapfile
```
## References
### Use `dd` instead of `fallocate`
See ["Files with holes" under the man page][swapon-holes-man].
[swapon-holes-man]: https://man.archlinux.org/man/core/util-linux/swapon.8.en#Files_with_holes
### The options field in fstab
On Linux, `sw` doesn't mean anything for `swapon`, so it gets ignored. See:
- [StackExchange answer 1](https://unix.stackexchange.com/a/365961/525130)
- [StackExchange answer 2](https://unix.stackexchange.com/a/365954/525130)
- [`parse_options` in the `swapon` source code](https://github.com/util-linux/util-linux/blob/2ea397239683270a0fc8cd3b72ed5457f52dbda8/sys-utils/swapon.c#L699)
- [options set by fstab `defaults` (none have any effect on `swapon`)](https://man.archlinux.org/man/fstab.5#The_fourth_field_(%3Ci%3Efs_mntops%3C/i%3E).)

View File

@ -2,16 +2,13 @@
title: Text substitution in Discord using `sed`
date: 2021-03-25T18:48:15-05:00
lastmod: 2021-10-19T14:02:08-05:00
toc: false
comments: true
authors:
- bbaovanc
aliases:
- /blog/posts/sed-text-substitution-in-discord/
- /blog/posts/text-substitution-in-discord-using-sed/
categories:
- tips-and-tricks

View File

@ -63,4 +63,4 @@ word or two, and Copilot turned it into a couple sentences.
## The finished product
The actual blog post written by Copilot is available [here]({{< ref "../copilot-post/" >}}).
The actual blog post written by Copilot is available [here]({{< ref "/blog/copilot-post/" >}}).

View File

@ -2,7 +2,7 @@
title: Youtube URL structures you should know
date: 2021-10-30T21:20:38-05:00
lastmod: 2022-05-02T00:59:25-05:00
lastmod: 2023-01-16T21:04:09-06:00
toc: true
comments: true
@ -13,7 +13,6 @@ categories:
- tips-and-tricks
tags:
- query-parameters
- url-structures
- youtube
@ -28,7 +27,7 @@ resources:
[What is a
URL?](https://developer.mozilla.org/en-US/docs/Learn/Common_questions/What_is_a_URL#parameters)
by [Mozilla
Contributors](https://developer.mozilla.org/en-US/docs/MDN/About/contributors.txt)
Contributors](https://developer.mozilla.org/en-US/docs/Learn/Common_questions/Web_mechanics/What_is_a_URL/contributors.txt)
is licensed under [CC-BY-SA
2.5](https://creativecommons.org/licenses/by-sa/2.5/)

View File

@ -0,0 +1,7 @@
---
title: Categories
---
Categories are the different types or styles of posts.

View File

@ -0,0 +1,10 @@
---
title: Experiments
---
These posts are less planned and instead focus around exploring something to
understand it better.
<!--more-->

View File

@ -1,9 +0,0 @@
---
title: Jailbreak
---
Anything related to jailbreaking (iOS or other Apple devices).
<!--more-->

View File

@ -0,0 +1,9 @@
---
title: Reviews
---
Posts that review stuff.
<!--more-->

View File

@ -1,9 +0,0 @@
---
title: Software
---
Posts that discuss/review various programs.
<!--more-->

View File

@ -1,9 +0,0 @@
---
title: Tinkering
---
Posts where I experiment with things.
<!--more-->

View File

@ -1,20 +0,0 @@
---
title: Contact
menu: main
toc: false
comments: true
authors:
- bbaovanc
description: >-
Want to contact me? Here's how you can.
---
- Email: bbaovanc@bbaovanc.com
- If needed, encrypt your email with [my PGP
key](https://keyserver.ubuntu.com/pks/lookup?search=bbaovanc%40bbaovanc.com&fingerprint=on&op=index)
- bobaforum (ask me questions publicly, I guess like a Q&A):
https://forum.bbaovanc.com/t/ask-me

View File

@ -1,25 +0,0 @@
---
title: Donate
menu: main
toc: false
comments: true
authors:
- bbaovanc
description: >-
I have a few cryptocurrency addresses that you can use if you want to donate
to me.
---
## Cryptocurrency Addresses
Nano: `nano_1ewtme68x5gia1bjq3jx1ku5pcxzayipdxjmjrc3x8qjjpat4ria8ajhjoxd`
Bitcoin: `bc1qj6h8z2tg9nxcl9ddnv9k798cru6asr6cpmj84m`
Ethereum: `0x80DaED7e2BEF5d894b37fBd79d0609aa17c8Cabc`
Monero: `45gGauNcWLNSobRMzk3rtfEpad7gGcEvegxCbEm6QYENdG4vag3fCVuFoKfdKSESeSEKyUNRGwAJyLaCQ6MC5AQ79DGcaRq`

View File

@ -8,37 +8,41 @@ comments: true
authors:
- bbaovanc
aliases:
- /blog/links/
description: >-
A page with links to a lot of my different projects.
---
## Other
## Profiles
- [GitHub](https://github.com/BBaoVanC/) - my GitHub profile
- [boba.best](https://boba.best/)
- [GitHub](https://github.com/BBaoVanC/) - my GitHub account
## My Website
- [bbaovanc.com source code](https://github.com/BBaoVanC/bbaovanc.com)
- [bobatheme](https://github.com/BBaoVanC/bobatheme) - theme for this
website
- [bobaforum](https://forum.bbaovanc.com) - my public forum
- [Searx Instance](https://search.bbaovanc.com/) - privacy-respecting search
engine
- [Gitea Instance](https://git.bbaovanc.com/) - mostly just mirrors of my GitHub
repos
- [bobatheme](https://github.com/BBaoVanC/bobatheme) - theme for this website
- [demo.bbaovanc.com](https://demo.bbaovanc.com) - previews of pull requests to my website
Also see [Isso](https://github.com/posativ/isso), which is currently the comment
system I use on my website.
### Other Websites
- [git.bbaovanc.com](https://git.bbaovanc.com) - mostly just mirrors of my GitHub repos
- [plausible.bbaovanc.com](https://plausible.bbaovanc.com/bbaovanc.com) -
anonymous analytics on my website
- [share.boba.best](https://share.boba.best) - temporary file uploader
- [status.bbaovanc.com](https://status.bbaovanc.com) - my status page
## My Projects
- [smines](https://github.com/BBaoVanC/smines) - TUI minesweeper in C, made for
practice
- [bobashare](https://github.com/BBaoVanC/bobashare) - simple file sharing
server, runs https://share.boba.best
- [bobascheme](https://github.com/BBaoVanC/bobascheme) - theme I use on my
terminal and editors
- [smines](https://github.com/BBaoVanC/smines) - terminal-based minesweeper in C
- [imgupload.py](https://github.com/imgupload-py/imgupload.py) - simple image
uploading server written with Python Flask
- [mojiman](https://github.com/BBaoVanC/mojiman) - program I made to learn Rust
- [pynamegen](https://git.bbaovanc.com/bbaovanc/pynamegen) - name generator
written in Python
- [libnamegen](https://git.bbaovanc.com/bbaovanc/libnamegen)
@ -47,16 +51,25 @@ description: >-
- [RokuRemote](https://github.com/BBaoVanC/RokuRemote) - keyboard-based remote
control for Roku
### Minecraft Plugins
- [bobawhitelist](https://github.com/BBaoVanC/bobawhitelist) - global whitelist
plugin for the [Velocity](https://github.com/PaperMC/Velocity) proxy
- [GlobalJoinLeave](https://github.com/bobacraft/GlobalJoinLeave) - global
join/leave messages on Velocity
- [velocitab](https://github.com/BBaoVanC/velocitab) - global tab list plugin
for Velocity
- [velocity-chat](https://github.com/BBaoVanC/velocity-chat) - global chat
plugin for Velocity
## My Configurations
- [dotfiles](https://github.com/BBaoVanC/dotfiles) - main repository with my
configs
- [docker-dotfiles](https://github.com/BBaoVanC/docker-dotfiles) - Docker image
that contains my dotfiles
- [onehalf](https://github.com/BBaoVanC/onehalf) - the theme I use on my
terminal
### Archived
### Historical configurations
- [dwm](https://github.com/BBaoVanC/.dwm) - outer repo with submodules for my
various dwm-related configs
@ -72,4 +85,5 @@ description: >-
https://tools.suckless.org/slstatus/
- [dwm](https://github.com/BBaoVanC/dwm) - dynamic window manager, see
https://dwm.suckless.org/
- [onehalf](https://github.com/BBaoVanC/onehalf) - nice theme that I used to use
- [xmonad](https://github.com/BBaoVanC/.xmonad) - see https://xmonad.org

12
content/search/index.md Normal file
View File

@ -0,0 +1,12 @@
---
title: Search
layout: search
menus:
main:
name: Search
---
Quickly search the full text of any article on my website! Powered by
[Pagefind](https://pagefind.app/).

7
content/series/_index.md Normal file
View File

@ -0,0 +1,7 @@
---
title: Series
---
Series are groups of closely related posts, often with some ordering to them.

View File

@ -0,0 +1,8 @@
---
title: Snippets
cascade:
build:
list: never
publishResources: false
render: never
---

View File

@ -0,0 +1,36 @@
---
title: Console command prefix formatting explanation
---
{{< aside info >}}
Commands in this article are prefixed them with a prompt symbol (either `$` or
`#`) which is not part of the command. Lines with no prompt symbol are output
from the command.
The `#` means to run it as `root` (usually using `sudo`):
```console
$ ls /var/lib/docker
ls: cannot open directory '/var/lib/docker': Permission denied
$ # this is a comment
$ # regular users aren't allowed to view /var/lib/docker, we need root
# ls /var/lib/docker
builder containerd image overlay2 runtimes tmp volumes
buildkit containers network plugins swarm trust
$ # we can do the same thing using sudo
$ sudo ls /var/lib/docker
[sudo] password for bbaovanc:
builder containerd image overlay2 runtimes tmp volumes
buildkit containers network plugins swarm trust
```
If you want to copy just the commands (for example: pasting them into your own
terminal to run them all), press the [Copy](javascript:void(0)) button in the top right of the code
block.
{{< /aside >}}

7
content/tags/_index.md Normal file
View File

@ -0,0 +1,7 @@
---
title: Tags
---
Tags are the specific topics that a post deals with.

View File

@ -1,10 +0,0 @@
---
title: Arch Linux
---
A Linux distribution which aims to be lightweight, flexible, and simple. See
https://archlinux.org for more information.
<!--more-->

View File

@ -1,12 +0,0 @@
---
title: bobanews
---
The main name for my newsletter. I recommend you read the [blog post I wrote
about it][newsletter-post].
[newsletter-post]: {{< ref "/blog/blog-post-newsletter" >}}
<!--more-->

View File

@ -1,13 +0,0 @@
---
title: checkra1n
---
An [iOS jailbreak][ios-jailbreaking] which supports the iPhone 4s to the iPhone
X. See the [official checkra1n website][checkra1n-website] for more information.
[ios-jailbreaking]: https://en.wikipedia.org/wiki/IOS_jailbreaking
[checkra1n-website]: https://checkra.in/
<!--more-->

View File

@ -1,13 +0,0 @@
---
title: Gitea
---
Gitea is a lightweight self-hosted Git service similar to GitHub. I use it on
[bbaovanc's Gitea][bbaovanc-gitea] and [bobatea][bobatea].
[bbaovanc-gitea]: https://git.bbaovanc.com
[bobatea]: https://git.boba.best
<!--more-->

View File

@ -0,0 +1,13 @@
---
title: Swap (Linux)
---
Swap space is storage on your drive that can be used as virtual memory when the
system is running low on physical memory (RAM). It is also used when hibernating
(suspend to disk).
<!--more-->
More information: https://haydenjames.io/linux-performance-almost-always-add-swap-space/

View File

@ -1,12 +0,0 @@
---
title: listmonk
---
A self-hosted newsletter manager which I use to handle my blog post newsletter.
Read [this blog post][newsletter-blog-post] for more information.
[newsletter-blog-post]: {{< ref "/blog/blog-post-newsletter" >}}
<!--more-->

View File

@ -1,15 +0,0 @@
---
title: Newsletter
---
Blog posts related to my newsletter.
<!--more-->
You can sign up for my newsletter [using this signup form][signup-form]. Make
sure that you tick the box labeled `bbaovanc.com Blog Posts`. A nickname (or
your real name if you prefer) is optional.
[signup-form]: https://lists.bbaovanc.com/subscription/form

View File

@ -0,0 +1,11 @@
---
title: swapfile
---
A swapfile is a file that gives your system more [swap]({{< relref
"../linux-swap" >}}) space, which is used when the system is running low on RAM,
or when hibernating.
<!--more-->

View File

@ -1,4 +1,4 @@
#!/bin/sh -x
rm -rf public/
HUGO_ENABLEMISSINGTRANSLATIONPLACEHOLDERS=true hugo -D --baseURL "https://demo.bbaovanc.com/test/$1"
rsync -avPzc --delete-delay public/ bbaosrv:/var/www/demo.bbaovanc.com/test/$1/
#!/bin/sh -ex
./audit.sh
DEST=public.demo/ ./build.sh --baseURL "https://demo.bbaovanc.com/test/$1"
rsync -avPzc --delete-delay public.demo/ bbaosrv:/var/www/demo.bbaovanc.com/test/$1/

View File

@ -1,21 +1,29 @@
baseURL: https://bbaovanc.com
theme: bobatheme
defaultContentLanguage: en
copyright: '&copy; 2021 bbaovanc <a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>'
copyright: >
<p>
&copy; 2021-2025 bbaovanc <a rel="license noopener noreferrer" href="https://creativecommons.org/licenses/by-sa/4.0/" target="_blank">CC BY-SA 4.0</a>
</p>
sectionPagesMenu: main
enableRobotsTXT: true
paginate: 10
enableGitInfo: true
pagination:
pagerSize: 10
taxonomies:
_merge: deep
author:
name: bbaovanc
markup: # this just keeps the bobatheme markup styling
_merge: deep
outputs:
_merge: deep
outputFormats:
_merge: deep
related:
includeNewer: true
indices:
@ -31,6 +39,9 @@ related:
toLower: true
params:
author:
name: bbaovanc
# these are for the OpenGraph/Twitter embeds in Hugo
description: My personal website
@ -58,9 +69,6 @@ params:
telegram: true
print: true
# show "Latest Posts" section at bottom of content pages
latestPostsOnContent: true
footer: >-
See the [anonymous and privacy-friendly
@ -79,10 +87,6 @@ languages:
weight: 1
menu:
main:
- identifier: forum
name: Forum
url: https://forum.bbaovanc.com
- identifier: status-page
name: Status Page
name: Status
url: https://status.bbaovanc.com

View File

@ -0,0 +1,24 @@
{{ if not hugo.IsServer }}
<script defer data-domain="bbaovanc.com" src="https://plausible.bbaovanc.com/js/bobalytics.outbound-links.js"></script>
<script>window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }</script>
{{ end }}
{{ with resources.Get "js/share-event.js" | fingerprint "sha512" }}
<script defer src="{{ .Permalink }}" integrity="{{ .Data.Integrity }}" crossorigin="anonymous"></script>
{{ end }}
{{ if eq .Layout "search" }}
{{ with resources.Get "css/search.css" | fingerprint "sha512" }}
<link rel="stylesheet" type="text/css" href="{{ .Permalink }}" integrity="{{ .Data.Integrity }}" crossorigin="anonymous">
{{ end }}
<link rel="stylesheet" type="text/css" href="{{ absURL "pagefind/pagefind-ui.css" }}" crossorigin="anonymous">
<script src="{{ absURL "pagefind/pagefind-ui.js" }}" crossorigin="anonymous"></script>
<script>
window.addEventListener('DOMContentLoaded', (event) => {
new PagefindUI({ element: "#search-box", showSubResults: true });
});
</script>
{{ end }}
<link rel="me" href="https://procursus.social/@bbaovanc" />

View File

@ -0,0 +1,56 @@
{{ with resources.Get "css/comments.css" | fingerprint "sha512" }}
<link rel="stylesheet" type="text/css" href="{{ .Permalink }}" integrity="{{ .Data.Integrity }}" crossorigin="anonymous">
{{ end }}
<h2 style="margin-bottom: 0;">Comments</h2>
<p style="margin: 0; font-size: smaller;">
If you provide an email address, you can enable notifications for
replies to your comment. It will not be shown publicly.
</p>
<noscript>
<i>Enable JavaScript to see the comment section.</i>
</noscript>
{{ $url := .Permalink }}
{{ if .IsTranslated }}
{{ with index .AllTranslations 0 }}
{{ $url = .Permalink }}
{{ end }}
{{ end }}
<script data-isso-id="{{ $url }}"
data-isso-default-lang="{{ .Language.Lang }}"
data-isso-css="true"
data-isso-max-comments-top="inf"
data-isso-max-comments-nested="inf"
data-isso-reveal-on-click="5"
{{/*
data-isso-avatar-bg="#111"
data-isso-avatar-fg="#9abf88 #5698c4 #e279a3 #9163b6 ..."
*/}}
data-isso-vote="true"
{{/*
data-isso-vote-levels=""
*/}}
data-isso-feed="true"
data-isso-require-email="false"
data-isso-reply-notifications="true"
data-isso-reply-notifications-default-enabled="true"
{{ with (.GetTerms "authors") }}
{{ $authorHashes := slice }}
{{ range . }}
{{ with .Params.issoUserID }}
{{ $authorHashes = $authorHashes | append . }}
{{ end }}
{{ end }}
data-isso-page-author-hashes="{{ delimit $authorHashes "," }}"
{{ end }}
src="https://isso.bbaovanc.com/js/embed.min.js">
</script>
<section id="isso-thread" data-title="{{ .Title }}"></section>

View File

@ -0,0 +1,5 @@
{{/* TODO: implement this
<span class="page-metadata-item" aria-label="comments counter">
<a href="#isso-thread">comments</a>
</span>
*/}}

View File

@ -1,4 +0,0 @@
{{ if eq .Site.BaseURL "https://bbaovanc.com" }}
<script defer data-domain="bbaovanc.com" src="https://plausible.bbaovanc.com/js/bobalytics.outbound-links.js"></script>
<script>window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }</script>
{{ end }}

View File

@ -1,155 +0,0 @@
<!-- idk why this is even required
vim: ft=html
-->
<style>
#isso-thread > h4 {
color: var(--text-1);
margin-bottom: 8px;
}
#isso-root .isso-comment:not(:first-of-type),
.isso-follow-up .isso-comment {
border-color: var(--background-highlight);
}
.isso-comment > .isso-text-wrapper > .isso-comment-header .isso-author,
.isso-comment > .isso-text-wrapper > .isso-comment-header .isso-page-author-suffix,
.isso-comment > .isso-text-wrapper > .isso-comment-footer,
.isso-comment > .isso-text-wrapper > .isso-comment-footer .isso-votes {
color: var(--text-1);
opacity: 80%;
}
.isso-comment.isso-is-page-author > .isso-text-wrapper {
background-color: var(--background-accent);
}
.isso-comment.isso-is-page-author > .isso-text-wrapper > .isso-comment-header > .isso-author {
color: var(--link-color);
}
.isso-postbox > .isso-form-wrapper .isso-preview {
color: var(--text-1);
background: var(--background-1);
}
.isso-comment > .isso-text-wrapper > .isso-comment-footer a,
.isso-comment > .isso-text-wrapper > .isso-comment-footer a:hover {
color: var(--link-color) !important;
}
.isso-comment > .isso-text-wrapper > .isso-comment-footer a:hover {
text-decoration: underline;
}
.isso-postbox > .isso-form-wrapper > .isso-auth-section .isso-input-wrapper input,
.isso-postbox > .isso-form-wrapper > .isso-auth-section .isso-post-action > input,
#isso-thread .isso-textarea,
.isso-postbox > .isso-form-wrapper .isso-preview {
color: var(--text-1);
background-color: var(--background-1);
border-color: var(--background-2) !important;
}
.isso-postbox > .isso-form-wrapper > .isso-auth-section .isso-post-action > input:hover {
background-color: var(--background-2);
}
.isso-postbox > .isso-form-wrapper > .isso-auth-section .isso-post-action > input:active {
background-color: var(--background-highlight);
}
#isso-thread .isso-textarea {
margin-bottom: 4px;
}
.isso-postbox > .isso-form-wrapper > .isso-auth-section .isso-input-wrapper {
display: inline-flex;
flex-direction: column;
margin-right: 4px;
}
.isso-postbox > .isso-form-wrapper > .isso-auth-section .isso-input-wrapper input {
order: 1;
}
.isso-postbox > .isso-form-wrapper > .isso-auth-section .isso-input-wrapper label {
order: 2;
font-size: small;
}
.isso-postbox > .isso-form-wrapper > .isso-auth-section .isso-post-action {
margin-left: 4px;
margin-top: 0;
}
@media screen and (max-width: 600px) {
.isso-postbox > .isso-form-wrapper > .isso-auth-section .isso-input-wrapper {
display: block;
margin-right: 0;
}
}
@media print {
.comments {
break-before: always;
}
.isso-comment > .isso-text-wrapper {
break-inside: avoid;
}
.isso-postbox,
.isso-feedlink {
display: none;
}
}
</style>
<h2 style="margin-bottom: 0;">Comments</h2>
<small>
<p style="margin: 0;">
If you provide an email address, you can enable notifications for
replies to your comment. It will not be shown publicly.
</p>
</small>
<noscript>
<i>Enable JavaScript to see the comment section.</i>
</noscript>
{{ $url := .Permalink }}
{{ if .IsTranslated }}
{{ with index .AllTranslations 0 }}
{{ $url = .Permalink }}
{{ end }}
{{ end }}
<script data-isso-id="{{ $url }}"
data-isso-default-lang="{{ .Language.Lang }}"
data-isso-css="true"
data-isso-max-comments-top="10"
data-isso-max-comments-nested="5"
data-isso-reveal-on-click="5"
{{/*
data-isso-avatar-bg="#111"
data-isso-avatar-fg="#9abf88 #5698c4 #e279a3 #9163b6 ..."
*/}}
data-isso-vote="true"
{{/*
data-isso-vote-levels=""
*/}}
data-isso-feed="true"
data-isso-require-email="false"
data-isso-reply-notifications="true"
data-isso-reply-notifications-default-enabled="true"
{{ with (.GetTerms "authors") }}
{{ $authorHashes := slice }}
{{ range . }}
{{ with .Params.issoUserID }}
{{ $authorHashes = $authorHashes | append . }}
{{ end }}
{{ end }}
data-isso-page-author-hashes="{{ delimit $authorHashes "," }}"
{{ end }}
src="https://isso.bbaovanc.com/js/embed.min.js">
</script>
<section id="isso-thread"></section>

3
layouts/search.html Normal file
View File

@ -0,0 +1,3 @@
{{ define "main" }}
<div id="search-box"></div>
{{ end }}

View File

@ -1,23 +0,0 @@
ci:
collect:
url:
- https://localhost/ # homepage
- https://localhost/links/ # very simple page
- https://localhost/blog/ # list page
- https://localhost/blog/the-redesign-of-my-website/ # average post, but no footnotes
- https://localhost/blog/blog-post-newsletter/ # average post, but WITH footnotes
- https://localhost/blog/caddy-is-the-best-webserver/ # another average post with footnotes, WITH code blocks
- https://localhost/blog/youtube-url-structures-you-should-know/ # youtube embed
- https://localhost/blog/copilot-post/ # lots of code blocks & text
- https://localhost/blog/github-copilot-experiments/ # heavy use of images
- https://localhost/categories/
- https://localhost/categories/linux/
- https://localhost/tags/
- https://localhost/tags/github-copilot/
startServerCommand: sudo caddy run
settings:
chromeFlags: "--ignore-certificate-errors --throttling.cpuSlowdownMultiplier=2.4"

4
staging.sh Executable file
View File

@ -0,0 +1,4 @@
#!/bin/sh -ex
./audit.sh
DEST=public.staging/ ./build.sh --baseURL "https://demo.bbaovanc.com/staging/$1"
rsync -avPzc --delete-delay public.staging/ bbaosrv:/var/www/demo.bbaovanc.com/staging/$1/