Skip to content

Enhance Hugo site with themes, configuration, and content updates - #1

Merged
bouroo merged 190 commits into
mainfrom
gh-pages
Jul 13, 2026
Merged

Enhance Hugo site with themes, configuration, and content updates#1
bouroo merged 190 commits into
mainfrom
gh-pages

Conversation

@bouroo

@bouroo bouroo commented Jul 13, 2026

Copy link
Copy Markdown
Owner

No description provided.

bouroo and others added 27 commits July 12, 2025 09:58
ปรับปรุงการใช้คำในบทความเกี่ยวกับการออกแบบฟังก์ชันใน Go โดยเปลี่ยนคำว่า 'อินพุต' และ 'เอาต์พุต' ให้เป็น 'Input' และ 'Output' เพื่อความสอดคล้องและชัดเจนยิ่งขึ้น
Renamed to "Accept interfaces, return structs" and
translated content to English for better accessibility.
Updated the article to reflect a Thai translation and improved explanations of using interfaces as inputs and structs as outputs in Go programming.
- Upgrade Hugo version to 0.145.0
- Update GitHub Actions to latest versions:
  - actions/checkout@v7
  - actions/configure-pages@v6
  - actions/upload-pages-artifact@v5
  - actions/deploy-pages@v5
- Update LoveIt theme submodule to latest commit
Remove YAML front matter from the about page as it is no longer
required for rendering or metadata management.
- Update SEO descriptions for all pages
- Remove informal language and emojis for a more professional tone
- Add licensing context to database posts
Bilingual (Thai + English) tutorial covering Rust installation, Cargo,
variables, data types, functions, control flow, and comments.

First article in the 8-part 'Learning Rust' series.
Bilingual tutorial covering Rust's ownership model, move semantics,
references, borrowing rules, slices, and lifetimes.

Part 2 of the 8-part 'Learning Rust' series.
Bilingual tutorial covering structs, impl methods, enums with data,
Option<T>, pattern matching, and Result<T,E> introduction.

Part 3 of the 8-part 'Learning Rust' series.
Bilingual tutorial covering Vec, HashMap, String vs &str, iterator
adaptors, and error handling with Result and the ? operator.

Part 4 of the 8-part 'Learning Rust' series.
Bilingual tutorial covering trait definitions, default implementations,
generics, trait bounds, trait objects, and standard library traits.

Part 5 of the 8-part 'Learning Rust' series.
Bilingual tutorial covering async/await, Tokio runtime, task spawning,
channels, async I/O, tokio::select!, and graceful shutdown.

Part 6 of the 8-part 'Learning Rust' series.
Bilingual tutorial building the actual rs-wsProxy project — Cargo.toml
dependencies, clap CLI args, AppState, config parsing, tracing logging,
Axum router with WebSocket upgrade handlers, and the verify pipeline.

Part 7 of the 8-part 'Learning Rust' series.
Source: https://github.com/bouroo/rs-wsProxy
…ment

Bilingual tutorial completing the rs-wsProxy project — TCP connection
with DNS resolution, bidirectional WS↔TCP pump with BytesMut zero-copy,
stream splitting, TLS with rustls, graceful shutdown, unit/integration
testing, Docker multi-stage build, Kubernetes manifests, and CI/CD.

Final part of the 8-part 'Learning Rust' series.
Source: https://github.com/bouroo/rs-wsProxy
- Add <!--more--> summary split to Part 4 English
- Fix broken series navigation links in Part 8 English conclusion
  (incorrect slugs → correct article paths)
Weave the real inspiration into the series narrative: saw a Facebook
post from rayrag.com showing RO playable in a browser via WebSocket to
an emulator server → curiosity → learned Rust from scratch → built
rs-wsProxy.

Updated intros and conclusions in Parts 1, 7, and 8 (both Thai and
English). Also fixes <!--more--> placement in Parts 1 and 8, and
corrects the roBrowser link to its GitHub repo.
…evisiting Rust'

The author already had prior Rust experience (e.g. the 2023 Rust FFI
article). Updated all 'from zero/scratch' phrasing across Parts 1 and 8
(both Thai and English) to reflect a review/refresh tone instead.

- TH: 'การเรียนรู้ Rust ตั้งแต่ศูนย์' → 'การกลับมาทบทวน Rust อีกครั้ง'
- EN: 'learning Rust from scratch' → 'revisiting Rust'
- EN series title: 'From Zero to...' → 'Building a...'
Migrate featured image references in post frontmatter from the global `/img/featured-image.webp` to local `featured-image.jpeg` files for better asset management.
@bouroo bouroo self-assigned this Jul 13, 2026
@bouroo
bouroo merged commit 6528f4c into main Jul 13, 2026
3 checks passed

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a comprehensive set of blog posts and pages written in both English and Thai, covering topics such as Go, Rust, database optimization, and cloud-native infrastructure, alongside Hugo configurations. The review feedback is highly constructive, pointing out several syntax errors, typos, and copy-paste mistakes within the code blocks of the markdown files (such as unclosed quotes, duplicate lines, and invalid return values like nill). It also highlights broken image links, redundant imports, and offers valuable security and portability recommendations, such as obfuscating public email addresses and using HTTPS instead of SSH for submodules.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

}

// This block executes when a termination signal is received
sig := <-closeChan:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

This line contains a trailing colon, which is a syntax error in Go and will prevent the code from compiling.

Suggested change
sig := <-closeChan:
sig := <-closeChan

func processStackPointer(d *Data) err {
// Use the original pointer on the stack
d = &Data{value: 42}
return nill

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

There's a typo in the return value. It should be nil, not nill. This will cause a compilation error.

Suggested change
return nill
return nil

การทำงานกับคีย์และค่าใน HashMap มีเรื่องของการเป็นเจ้าของ (ownership) ที่สำคัญ เมื่อเราใส่ค่าแบบ `String` ลงใน HashMap HashMap จะเป็นเจ้าของค่านั้น หมายความว่าเราจะไม่สามารถใช้ตัวแปรเดิมที่เคยถือค่านั้นได้อีกต่อไปหลังจากที่ใส่เข้าไปแล้ว หากต้องการรักษาการเป็นเจ้าของไว้เราสามารถใช้อ้างอิง (`&String`) แทนได้ แต่ต้องแน่ใจว่าข้อมูลที่อ้างอิงนั้นมีอายุยืนยาวกว่า HashMap

```rust
use std::collections ฮ HashMap;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

There is a typo in the use statement. The character should be ::. This will cause a compilation error.

Suggested change
use std::collectionsHashMap;
use std::collections::HashMap;

Comment on lines +72 to +73
ORDER BY
created_at;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

This second ORDER BY clause within the subquery is syntactically incorrect in most SQL dialects. A derived table can have an ORDER BY only if it's combined with LIMIT, which you already have. This will likely cause a query error.

Comment on lines +330 to +332

ตัวอย่างที่เป็นประโยชน์มากขึ้นคือการใช้ `select!` ในการทำ bidirectional communication ระหว่าง WebSocket และ TCP socket เช่นในโปรเจกต์ wsProxy ของเรา:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

There appears to be a copy-paste error here. The line println!("Interval tick"); is duplicated and placed outside the select! block's arm, which is invalid syntax and will cause a compilation error.

Suggested change
ตัวอย่างที่เป็นประโยชน์มากขึ้นคือการใช้ `select!` ในการทำ bidirectional communication ระหว่าง WebSocket และ TCP socket เช่นในโปรเจกต์ wsProxy ของเรา:
}
}

Compared to relational DBs, NoSQL DBs are designed to be optimized for specific data types, resulting in higher performance (if used for the right type of task).

## Types of NoSQL DB
![nosql_db_tpyes](img/nosql_db_tpyes.webp "nosql_db_tpyes")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

There appears to be a typo in the image filename (tpyes instead of types). This will cause a broken image link on the rendered page.

Suggested change
![nosql_db_tpyes](img/nosql_db_tpyes.webp "nosql_db_tpyes")
![nosql_db_types](img/nosql_db_types.webp "nosql_db_types")

authorLink: "https://kawin.dev"
description: "บทความนี้จะแนะนำวิธีการซ่อนเว็บของเราไว้ข้างหลัง cloudflare อย่างมิดชิด"
aliases:
- /posts/go_solid/

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The alias /posts/go_solid/ seems unrelated to this post's content about Cloudflare. This might be a copy-paste error and could negatively impact SEO or cause confusion if you're redirecting from an old URL. Please verify that this is the intended alias.

authorLink: "https://kawin.dev"
description: "This article will guide you on how to securely hide your website behind Cloudflare."
aliases:
- /posts/go_solid/

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The alias /posts/go_solid/ seems unrelated to this post's content about Cloudflare. This might be a copy-paste error and could negatively impact SEO or cause confusion if you're redirecting from an old URL. Please verify that this is the intended alias.

Comment thread content/about/index.en.md
[![LinkedIn](https://img.shields.io/badge/LinkedIn-%230077B5.svg?logo=linkedin&logoColor=white)](https://linkedin.com/in/kawin-vir) [![Twitter](https://img.shields.io/badge/Twitter-%231DA1F2.svg?logo=Twitter&logoColor=white)](https://twitter.com/bouroo)

# Tech Stack
![Go](https://img.shields.io/badge/go-%2300ADD8.svg?style=for-the-badge&logo=go&logoColor=white) ![Rust](https://img.shields.io/badge/rust-%23000000.svg?style=for-the-badge&logo=rust&logoColor=white) ![Shell Script](https://img.shields.io/badge/shell_script-%23121011.svg?style=for-the-badge&logo=gnu-bash&logoColor=white) ![TypeScript](https://img.shields.io/badge/typescript-%23007ACC.svg?style=for-the-badge&logo=typescript&logoColor=white) ![Cloudflare](https://img.shields.io/badge/Cloudflare-F38020?style=for-the-badge&logo=Cloudflare&logoColor=white) ![JWT](https://img.shields.io/badge/JWT-black?style=for-the-badge&logo=JSON%20web%20tokens) ![Nginx](https://img.shields.io/badge/nginx-%23009639.svg?style=for-the-badge&logo=nginx&logoColor=white) ![MariaDB](https://img.shields.io/badge/MariaDB-003545?style=for-the-badge&logo=mariadb&logoColor=white) ![Redis](https://img.shields.io/badge/redis-%23DD0031.svg?style=for-the-badge&logo=redis&logoColor=white) ![Supabase](https://img.shields.io/badge/Supabase-3ECF8E?style=for-the-badge&logo=supabase&logoColor=white) ![SQLite](https://img.shields.io/badge/sqlite-%2307405e.svg?style=for-the-badge&logo=sqlite&logoColor=white) ![MongoDB](https://img.shields.io/badge/MongoDB-%234ea94b.svg?style=for-the-badge&logo=mongodb&logoColor=white) ![LINUX](https://img.shields.io/badge/Linux-FCC624?style=for-the-badge&logo=linux&logoColor=black) ![Docker](https://img.shields.io/badge/docker-%230db7ed.svg?style=for-the-badge&logo=docker&logoColor=white) ![Rancher](https://img.io/badge/rancher-%230075A8.svg?style=for-the-badge&logo=rancher&logoColor=white)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The URL for the Rancher badge appears to have a typo. The domain img.io is likely incorrect and should be img.shields.io. This will cause the badge image to be broken.

Suggested change
![Go](https://img.shields.io/badge/go-%2300ADD8.svg?style=for-the-badge&logo=go&logoColor=white) ![Rust](https://img.shields.io/badge/rust-%23000000.svg?style=for-the-badge&logo=rust&logoColor=white) ![Shell Script](https://img.shields.io/badge/shell_script-%23121011.svg?style=for-the-badge&logo=gnu-bash&logoColor=white) ![TypeScript](https://img.shields.io/badge/typescript-%23007ACC.svg?style=for-the-badge&logo=typescript&logoColor=white) ![Cloudflare](https://img.shields.io/badge/Cloudflare-F38020?style=for-the-badge&logo=Cloudflare&logoColor=white) ![JWT](https://img.shields.io/badge/JWT-black?style=for-the-badge&logo=JSON%20web%20tokens) ![Nginx](https://img.shields.io/badge/nginx-%23009639.svg?style=for-the-badge&logo=nginx&logoColor=white) ![MariaDB](https://img.shields.io/badge/MariaDB-003545?style=for-the-badge&logo=mariadb&logoColor=white) ![Redis](https://img.shields.io/badge/redis-%23DD0031.svg?style=for-the-badge&logo=redis&logoColor=white) ![Supabase](https://img.shields.io/badge/Supabase-3ECF8E?style=for-the-badge&logo=supabase&logoColor=white) ![SQLite](https://img.shields.io/badge/sqlite-%2307405e.svg?style=for-the-badge&logo=sqlite&logoColor=white) ![MongoDB](https://img.shields.io/badge/MongoDB-%234ea94b.svg?style=for-the-badge&logo=mongodb&logoColor=white) ![LINUX](https://img.shields.io/badge/Linux-FCC624?style=for-the-badge&logo=linux&logoColor=black) ![Docker](https://img.shields.io/badge/docker-%230db7ed.svg?style=for-the-badge&logo=docker&logoColor=white) ![Rancher](https://img.io/badge/rancher-%230075A8.svg?style=for-the-badge&logo=rancher&logoColor=white)
![Go](https://img.shields.io/badge/go-%2300ADD8.svg?style=for-the-badge&logo=go&logoColor=white) ![Rust](https://img.shields.io/badge/rust-%23000000.svg?style=for-the-badge&logo=rust&logoColor=white) ![Shell Script](https://img.shields.io/badge/shell_script-%23121011.svg?style=for-the-badge&logo=gnu-bash&logoColor=white) ![TypeScript](https://img.shields.io/badge/typescript-%23007ACC.svg?style=for-the-badge&logo=typescript&logoColor=white) ![Cloudflare](https://img.shields.io/badge/Cloudflare-F38020?style=for-the-badge&logo=Cloudflare&logoColor=white) ![JWT](https://img.shields.io/badge/JWT-black?style=for-the-badge&logo=JSON%20web%20tokens) ![Nginx](https://img.shields.io/badge/nginx-%23009639.svg?style=for-the-badge&logo=nginx&logoColor=white) ![MariaDB](https://img.shields.io/badge/MariaDB-003545?style=for-the-badge&logo=mariadb&logoColor=white) ![Redis](https://img.shields.io/badge/redis-%23DD0031.svg?style=for-the-badge&logo=redis&logoColor=white) ![Supabase](https://img.shields.io/badge/Supabase-3ECF8E?style=for-the-badge&logo=supabase&logoColor=white) ![SQLite](https://img.shields.io/badge/sqlite-%2307405e.svg?style=for-the-badge&logo=sqlite&logoColor=white) ![MongoDB](https://img.shields.io/badge/MongoDB-%234ea94b.svg?style=for-the-badge&logo=mongodb&logoColor=white) ![LINUX](https://img.shields.io/badge/Linux-FCC624?style=for-the-badge&logo=linux&logoColor=black) ![Docker](https://img.shields.io/badge/docker-%230db7ed.svg?style=for-the-badge&logo=docker&logoColor=white) ![Rancher](https://img.shields.io/badge/rancher-%230075A8.svg?style=for-the-badge&logo=rancher&logoColor=white)

Comment on lines +108 to +111
use std::net::ToSocketAddrs;
use std::net::ToSocketAddrs;
use std::net::ToSocketAddrs;
use std::net::ToSocketAddrs;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The import use std::net::ToSocketAddrs; is duplicated multiple times. This is redundant and should be cleaned up for better code maintainability.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants