75 Commits

Author SHA1 Message Date
86c4b1ea18 a 2023-04-03 14:35:49 -05:00
3be325b34d Merge the other swapfile post into References section 2023-04-03 12:42:35 -05:00
ea27c632b5 Add a comment before the sudo command 2023-04-02 17:54:49 -05:00
9e4e72c711 Rename the guide 2023-04-02 17:54:49 -05:00
80ecf66cbe Add instructions for how to delete swapfile 2023-04-02 17:54:48 -05:00
3d69f686d5 Update guide 2023-04-02 17:54:48 -05:00
7315daf89c Add series and tag pages 2023-04-02 17:54:48 -05:00
e942d3ca4f Change bashsession include to an info 2023-04-02 17:54:48 -05:00
a899d617be Remove tutorial heading 2023-04-02 17:54:48 -05:00
5d8afcca7e Add swapfile guide article drafts 2023-04-02 17:54:48 -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
44 changed files with 865 additions and 151 deletions

View File

@ -2,8 +2,6 @@ name: Audit
on:
push:
branches:
- master
pull_request:
jobs:
@ -18,7 +16,7 @@ jobs:
- name: Checkout (pull_request)
if: github.event.pull_request
uses: actions/checkout@v2
uses: actions/checkout@v3
with:
submodules: recursive
fetch-depth: 0
@ -26,7 +24,7 @@ jobs:
- name: Checkout (push)
if: github.event_name == 'push'
uses: actions/checkout@v2
uses: actions/checkout@v3
with:
submodules: recursive
fetch-depth: 0
@ -34,10 +32,10 @@ jobs:
- name: Build previous commit
run: |
hugo --printI18nWarnings --printPathWarnings --baseURL https://localhost -d old/
hugo --buildDrafts --printI18nWarnings --printPathWarnings --baseURL https://localhost -d old/
- name: Checkout current commit
uses: actions/checkout@v2
uses: actions/checkout@v3
with:
submodules: recursive
fetch-depth: 0
@ -45,7 +43,7 @@ jobs:
- name: Build current commit
run: |
hugo --printI18nWarnings --printPathWarnings --baseURL https://localhost
hugo --buildDrafts --printI18nWarnings --printPathWarnings --baseURL https://localhost
cp -r public/ new/
# copy, so that public/ stays, it will be needed for Caddy to serve
@ -65,15 +63,16 @@ jobs:
DOMAIN: localhost
run: |
urls="$(./changed-urls.sh)"
urls="${urls//'%'/'%25'}"
urls="${urls//$'\n'/'%0A'}"
urls="${urls//$'\r'/'%0D'}"
echo "::set-output name=urls::$urls"
echo "urls<<EOM" >> $GITHUB_OUTPUT
echo "$urls" >> $GITHUB_OUTPUT
echo "EOM" >> $GITHUB_OUTPUT
echo -e "CHANGED:\n$urls"
- name: Install Caddy
if: "${{ steps.changed_urls.outputs.urls != '' }}"
run: |
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asc
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
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
@ -92,7 +91,7 @@ jobs:
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
serverToken: 2fca0410-95ae-4ea9-8dc6-687ed7843a3a
urls: ${{ steps.changed_urls.outputs.urls }}
@ -100,7 +99,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3
with:
submodules: recursive
fetch-depth: 0
@ -115,7 +114,7 @@ jobs:
- name: Build
run: |
HUGO_MINIFY_TDEWOLFF_HTML_KEEPCOMMENTS=true HUGO_ENABLEMISSINGTRANSLATIONPLACEHOLDERS=true hugo --printI18nWarnings --printPathWarnings
HUGO_MINIFY_TDEWOLFF_HTML_KEEPCOMMENTS=true HUGO_ENABLEMISSINGTRANSLATIONPLACEHOLDERS=true hugo --buildDrafts --printI18nWarnings --printPathWarnings
# For the following steps, see
# https://discourse.gohugo.io/t/audit-your-published-site-for-problems/35184

View File

@ -14,7 +14,7 @@ jobs:
url: https://bbaovanc.com
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3
with:
submodules: recursive
fetch-depth: 0

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
@ -36,7 +36,7 @@ jobs:
extended: true
- name: Build
run: hugo --printI18nWarnings --printPathWarnings --baseURL "https://demo.bbaovanc.com/pull_request/${{ github.event.number }}"
run: hugo --printI18nWarnings --printPathWarnings --baseURL "https://demo.bbaovanc.com/pull_request/${{ github.event.number }}" --buildDrafts
- name: Compress
run: |
@ -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

View File

@ -2,9 +2,10 @@
## 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.
Use the [GitHub Discussions forum][github-discussions-url] for any questions,
or ideas. Use the "Q&A" section for both questions and issues as well.
[github-discussions-url]: https://github.com/BBaoVanC/bbaovanc.com/discussions
## Building

View File

@ -4,5 +4,5 @@ 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.
Use [GitHub Discussions](https://github.com/BBaoVanC/bbaovanc.com/discussions)
for questions, ideas, discussions, etc. relating to me or my website.

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 */
}

View File

@ -1,6 +1,6 @@
#!/bin/sh
diff -qrN old/ new/ |
diff -qrNtbB old/ new/ |
grep -oP '(?<=\s)new\/\S*' |
xargs -d '\n' ls -1d 2>/dev/null |
grep 'index.html$' |

View File

@ -1,7 +1,7 @@
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: '&copy; 2021-2023 bbaovanc <a rel="license" href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>'
sectionPagesMenu: main
enableRobotsTXT: true
paginate: 10
@ -59,7 +59,7 @@ params:
print: true
# show "Latest Posts" section at bottom of content pages
latestPostsOnContent: true
# latestPostsOnContent: true
footer: >-
@ -79,10 +79,6 @@ languages:
weight: 1
menu:
main:
- identifier: forum
name: Forum
url: https://forum.bbaovanc.com
- identifier: status-page
name: Status Page
url: https://status.bbaovanc.com

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

@ -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

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
@ -15,7 +15,6 @@ categories:
tags:
- bobanews
- listmonk
- mailing-list
- newsletter
# this will be shown for the article in list pages and in the page metadata
@ -38,6 +37,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 +78,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
@ -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.

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,295 @@
---
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
_build:
# won't appear on main Home page, but will in Blog
list: local
# 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
```bashsession
$ 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:
[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].
[math-challenge-caching]: https://github.com/rebane2001/txnor-server/blob/26c7c279b0b4668c8a3b061692d83c507aeac7c5/sex.py#L137
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

View File

@ -2,7 +2,7 @@
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
@ -35,6 +35,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

@ -0,0 +1,270 @@
---
title: How to create (or remove) a swapfile on Linux
date: 2023-01-23T20:26:18-06:00
lastmod: 2023-01-23T20:26:18-06:00
toc: true
comments: true
draft: true
authors:
- bbaovanc
categories:
- guides
- linux
- tips-and-tricks
tags:
- linux-swap
- swapfile
series:
- swapfile-guide
# 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: something.webp
title: Some image (image format can be anything; webp is just an example)
---
This is a step-by-step tutorial on how to create or remove a swapfile on a Linux
machine, and whether you should create swap space in the first place.
Also included is the most correct `fstab` entry: most articles get this "wrong"
(but it doesn't actually matter).
<!--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 path="include/bashsession.md" markdown=true >}}
### Step 1: Create the file
The first step is to allocate the file.
```bashsession
# 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:
{{< table >}}
| GiB | MiB |
|-----|-------------|
| 1 | count=1024 |
| 2 | count=2048 |
| 3 | count=3072 |
| 4 | count=4096 |
| 8 | count=8192 |
| 16 | count=16384 |
{{< /table >}}
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:
```bashsession
# 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:
```bashsession
# 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):
```bashsession
# 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`. This is actually a result of
[cargo culting](https://en.wiktionary.org/wiki/cargo_culting). On Linux, the
`sw` option (and the [options specified by the commonly used
`defaults`][fstab-defaults-man]) [isn't valid for `swapon` and is
ignored][swapon-options-source]. 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).
[fstab-defaults-man]: https://man.archlinux.org/man/fstab.5#The_fourth_field_(%3Ci%3Efs_mntops%3C/i%3E).
[swapon-options-source]: https://github.com/util-linux/util-linux/blob/2ea397239683270a0fc8cd3b72ed5457f52dbda8/sys-utils/swapon.c#L699
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.
```bashsession
# swapon /swapfile
```
### Finally: check the swap status
Use `swapon` and `free` to verify that your new swapfile has been added:
```bashsession
$ 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.
```bashsession
$ 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
```bashsession
$ 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
```bashsession
# 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)

View File

@ -2,6 +2,7 @@
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

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
@ -28,7 +28,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/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
---
List of categories on my website. These are different types or styles of posts.

View File

@ -16,5 +16,5 @@ description: >-
- 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
- GitHub Discussions (Q&A):
https://github.com/BBaoVanC/bbaovanc.com/discussions/categories/q-a

View File

@ -26,7 +26,6 @@ description: >-
- [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

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

@ -0,0 +1,7 @@
---
title: Series
---
List of series, which are sequences of closely related posts.

View File

@ -0,0 +1,10 @@
---
title: Swapfile Guide
---
A tutorial on how to set up a swapfile on Linux, but with some more depth than
just a step-by-step.
<!--more-->

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

@ -0,0 +1,8 @@
---
title: Tags
---
List of tags on my website. These are specific things or ideas that I talk about
in a post.

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 information: https://haydenjames.io/linux-performance-almost-always-add-swap-space/
<!--more-->

View File

@ -0,0 +1,16 @@
---
title: Query Parameters
---
Query parameters are a map of fields and values after the question mark in a
URL.
<!--more-->
Optionally provide more information about the tag here. This part will only show
on the tag page, not on the tags list page.
If you delete this section, DO NOT delete the summary separator (`<!--more-->`)
or else the summary won't be shown.

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-->

32
include/bashsession.md Normal file
View File

@ -0,0 +1,32 @@
{{< 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`):
```bashsession
$ 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 >}}

View File

@ -2,3 +2,5 @@
<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 }}
<link rel="me" href="https://procursus.social/@bbaovanc" />

View File

@ -1,103 +1,6 @@
<!-- 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>
{{ 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>
<small>
@ -152,4 +55,4 @@
src="https://isso.bbaovanc.com/js/embed.min.js">
</script>
<section id="isso-thread"></section>
<section id="isso-thread" data-title="{{ .Title }}"></section>