Skip to content

Commit 3250530

Browse files
feat: Thêm quy trình tự động cập nhật số liệu GitHub
1 parent cc41297 commit 3250530

7 files changed

Lines changed: 304 additions & 166 deletions

File tree

.github/workflows/update-stats.yml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
name: Update GitHub Stats
2+
3+
# Các trình kích hoạt (triggers) cho workflow
4+
on:
5+
# 1. Chạy tự động mỗi ngày vào lúc 1:00 sáng (giờ Việt Nam)
6+
schedule:
7+
- cron: '0 18 * * *' # Đây là 18:00 UTC, tương đương 1:00 sáng hôm sau ở VN
8+
9+
# 2. Cho phép chạy thủ công từ tab "Actions" trên GitHub
10+
workflow_dispatch:
11+
12+
jobs:
13+
update-stats:
14+
runs-on: ubuntu-latest # Chạy trên một máy ảo Ubuntu mới nhất
15+
steps:
16+
# Bước 1: Lấy mã nguồn của bạn từ kho lưu trữ
17+
- name: Check out repository
18+
uses: actions/checkout@v3
19+
20+
# Bước 2: Thiết lập môi trường Node.js
21+
- name: Set up Node.js
22+
uses: actions/setup-node@v3
23+
with:
24+
node-version: '18' # Sử dụng Node.js phiên bản 18
25+
26+
# Bước 3: Chạy tập lệnh update-stats.js
27+
- name: Run update script
28+
run: node scripts/update-stats.js
29+
30+
# Bước 4: Tự động commit và đẩy các thay đổi (nếu có)
31+
- name: Commit and push changes
32+
uses: stefanzweifel/git-auto-commit-action@v4
33+
with:
34+
commit_message: 'chore: Tự động cập nhật số liệu thống kê GitHub'
35+
file_pattern: 'github_stats.json' # Chỉ commit nếu tệp này thay đổi
36+
commit_user_name: 'GitHub Actions Bot'
37+
commit_user_email: 'actions@github.com'
38+
commit_author: 'GitHub Actions Bot <actions@github.com>'

GEMINI.md

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
## Cuộc trò chuyện với Gemini CLI
2+
3+
**Ngày:** Sunday, October 26, 2025
4+
**Hệ điều hành:** win32
5+
**Thư mục làm việc:** D:\Huu Dat\my-portfolio-2024
6+
7+
---
8+
9+
### Phân tích dự án và các vấn đề tiềm ẩn
10+
11+
**Người dùng:** what are the possible issues that you could find from this project
12+
13+
**Gemini:** Dựa trên phân tích của tôi về dự án, đây là một số vấn đề tiềm ẩn, từ nhỏ đến đáng kể:
14+
15+
**Vấn đề Tác động Cao**
16+
17+
* **Gọi API GitHub không xác thực:** Script `js/github.js` gọi đến API của GitHub mà không có xác thực. Điều này là một vấn đề lớn vì các yêu cầu không xác thực bị giới hạn rất nghiêm ngặt (60 yêu cầu mỗi giờ cho mỗi địa chỉ IP). Nếu trang web có lượng truy cập vừa phải, giới hạn API sẽ nhanh chóng bị cạn kiệt, khiến mục "My Projects on GitHub" không thể tải được cho những người dùng truy cập sau.
18+
* **Header/Footer được chèn bằng JavaScript:** Trang web sử dụng một phương pháp không chuẩn là dùng các thẻ `<header-placeholder>``<footer-placeholder>`, sau đó dùng `header.js``footer.js` để chèn nội dung HTML vào. Điều này có hại cho Tối ưu hóa Công cụ Tìm kiếm (SEO), vì các trình thu thập dữ liệu của công cụ tìm kiếm có thể không thực thi JavaScript và do đó không nhìn thấy nội dung và các liên kết điều hướng trong header và footer. Nó cũng có thể gây ra hiện tượng "nhấp nháy" nội dung khi trang tải.
19+
20+
**Vấn đề Tác động Trung bình**
21+
22+
* **Tệp CSS lớn, nguyên khối:** Tệp `css/styles.css` chứa toàn bộ framework Bootstrap 5.2.3. Tệp này rất lớn và sẽ ảnh hưởng tiêu cực đến thời gian tải trang, vì trình duyệt phải tải xuống và phân tích toàn bộ tệp, ngay cả khi chỉ một phần nhỏ các style được sử dụng.
23+
* **JavaScript inline quá nhiều:** Một lượng lớn mã JavaScript, bao gồm hệ thống dịch ngôn ngữ và logic con trỏ tương tác, được đặt trực tiếp trong thẻ `<script>` trong tệp `index.html`. Điều này làm cho mã khó bảo trì, gỡ lỗi và tái sử dụng hơn. Nó cũng ngăn trình duyệt lưu trữ mã này vào bộ đệm một cách riêng biệt với nội dung HTML.
24+
* **Không có Trình quản lý Gói (Package Manager):** Dự án thiếu tệp `package.json` hoặc bất kỳ tệp quản lý phụ thuộc nào khác. Điều này làm cho việc cập nhật các phụ thuộc, kiểm tra lỗ hổng bảo mật hoặc cộng tác với các nhà phát triển khác trở nên rất khó khăn.
25+
* **Lo ngại về Khả năng Tiếp cận (Accessibility):** Con trỏ tùy chỉnh ẩn con trỏ tiêu chuẩn của người dùng (`cursor: none;`). Mặc dù thú vị về mặt hình ảnh, điều này có thể gây nhầm lẫn và mất phương hướng cho người dùng, đặc biệt là những người bị suy giảm kỹ năng vận động hoặc những người không mong đợi hành vi này. Đây thường là một thực hành không tốt về khả năng tiếp cận.
26+
27+
**Vấn đề Tác động Thấp & Khả năng Bảo trì**
28+
29+
* **Cấu trúc Dự án không rõ ràng:** Có nhiều tệp HTML trong thư mục gốc (ví dụ: `brickshop.html`, `omacha-shop.html`, `animation.html`). Không rõ liệu chúng có phải là một phần của portfolio chính, cũ hay các dự án riêng biệt, không liên quan. Điều này làm cho kho lưu trữ khó hiểu để điều hướng.
30+
* **Bản dịch được hardcode:** Các chuỗi dịch cho tiếng Anh và tiếng Việt được lưu trữ trong một đối tượng JavaScript lớn bên trong `index.html`. Đối với một trang web có nhiều hơn hai ngôn ngữ hoặc nhiều nội dung hơn, cách tiếp cận này sẽ trở nên rất khó quản lý. Một thư viện i18n chuyên dụng hoặc các tệp JSON riêng cho mỗi ngôn ngữ sẽ là một giải pháp tốt hơn.
31+
* **Không có Quy trình Build:** Dự án là một tập hợp các tệp tĩnh không có bước build. Một quy trình build (sử dụng các công cụ như Vite, Webpack, hoặc Parcel) có thể tự động hóa các tác vụ như tối ưu hóa hình ảnh, gộp và thu nhỏ CSS và JavaScript, và cung cấp một máy chủ phát triển tốt hơn.
32+
* **CSS động cho Ngôn ngữ GitHub:** Tệp `js/github.js` cố gắng tạo động các thẻ `<style>` cho màu sắc ngôn ngữ. Đây là một cách tiếp cận không theo quy ước và hơi mong manh. Sẽ mạnh mẽ hơn nếu có một bộ các lớp CSS được xác định trước cho các ngôn ngữ lập trình phổ biến.
33+
34+
**Người dùng:** hãy giải thích bằng tieensg việt
35+
36+
**Gemini:** (Giải thích các vấn đề bằng tiếng Việt)
37+
38+
**Người dùng:** các tệp brickshop, omacha shop là các project được mô tả chi tiết và hình ảnh demo mà
39+
40+
**Gemini:** Cảm ơn bạn đã làm rõ. Tôi hiểu rằng các tệp như `brickshop.html``omacha-shop.html` là các trang dự án riêng biệt, chứa mô tả chi tiết và hình ảnh demo cho từng dự án. Điều này có nghĩa là chúng không phải là các tệp không sử dụng, mà là một phần có chủ đích của portfolio.
41+
42+
Tôi sẽ tiếp tục phân tích các tệp còn lại để tìm ra các vấn đề tiềm ẩn khác. Tiếp theo, tôi sẽ đọc tệp `contact.html`.
43+
44+
**Người dùng:** vậy bạn tạo file feedback.md cho project này của mình qua những lời nhận xét của bạn
45+
46+
**Gemini:** (Tạo file `feedback.md` với nội dung đã được dịch sang tiếng Việt)
47+
48+
**Người dùng:** ### 1. Sử dụng API GitHub không xác thực-
49+
50+
**Gemini:** Để giải quyết vấn đề này, có hai hướng tiếp cận chính. Tôi sẽ giải thích cả hai và bạn có thể chọn phương án phù hợp nhất với mình.
51+
52+
**Phương án 1: An toàn và Tốt nhất (Khuyến nghị)**
53+
54+
Chúng ta sẽ tạo một "proxy" bằng cách sử dụng một hàm serverless (serverless function).
55+
56+
* **Cách hoạt động:**
57+
1. JavaScript phía client (trong trình duyệt của người dùng) sẽ không gọi trực tiếp đến API của GitHub nữa.
58+
2. Thay vào đó, nó sẽ gọi đến một hàm serverless mà chúng ta sẽ tạo (ví dụ: `/.netlify/functions/github-proxy`).
59+
3. Hàm serverless này, chạy trên một máy chủ an toàn, sẽ chứa API token của bạn. Nó sẽ nhận yêu cầu từ client, thêm token vào và gọi đến API của GitHub.
60+
4. Cuối cùng, nó sẽ trả kết quả từ GitHub về lại cho client.
61+
* **Ưu điểm:** API token của bạn được giữ bí mật tuyệt đối, không bao giờ bị lộ ra ngoài. Đây là cách làm chuyên nghiệp và an toàn nhất.
62+
* **Nhược điểm:** Phức tạp hơn một chút để thiết lập ban đầu. Bạn sẽ cần một nền tảng hosting hỗ trợ serverless functions như Netlify hoặc Vercel.
63+
64+
**Phương án 2: Đơn giản nhưng Kém an toàn (Không khuyến nghị cho dự án công khai)**
65+
66+
Chúng ta sẽ sử dụng trực tiếp một Personal Access Token (PAT) trong mã JavaScript.
67+
68+
* **Cách hoạt động:**
69+
1. Bạn tạo một PAT trên tài khoản GitHub của mình.
70+
2. Bạn dán token này trực tiếp vào các tệp `js/github.js``js/render-readme.js`.
71+
* **Ưu điểm:** Rất nhanh và dễ thực hiện.
72+
* **Nhược điểm:** **CỰC KỲ RỦI RO.** Bất kỳ ai xem mã nguồn trang web của bạn (chỉ cần "View Page Source") đều có thể thấy và sao chép token của bạn. Với token đó, họ có thể thực hiện các hành động thay mặt bạn trên GitHub, tùy thuộc vào quyền bạn đã cấp cho token. **Chỉ nên sử dụng cách này nếu repository của bạn là riêng tư (private) và bạn chấp nhận rủi ro.**
73+
74+
Tôi khuyên bạn nên chọn **Phương án 1**. Mặc dù tốn thêm một chút công sức, nó sẽ đảm bảo an toàn cho tài khoản của bạn và là một kỹ năng rất hữu ích để học.
75+
76+
Bạn muốn tiếp tục với phương án nào?
77+
78+
**Người dùng:** mà dự án này thuần html để chạy github pages mà, loại bỏ và xóa file github.html luôn
79+
80+
**Gemini:** Bạn nói đúng. Nếu đây là một trang thuần HTML cho GitHub Pages, việc gọi API động sẽ gây ra các vấn đề như tôi đã nêu.
81+
82+
Vậy tôi hiểu rằng bạn muốn:
83+
1. Xóa bỏ phần "Các Dự Án Của Tôi trên GitHub" đang được tải động trên trang `index.html`.
84+
2. Xóa hoàn toàn tệp `github-readme.html` và tệp `js/render-readme.js` liên quan.
85+
3. Xóa luôn tệp `js/github.js` vì nó sẽ không còn được sử dụng.
86+
87+
Điều này có đúng không?
88+
89+
**Người dùng:** chính xác, bạn thực hiện đi
90+
91+
**Gemini:** (Thực hiện xóa phần GitHub Projects khỏi `index.html` và xóa các tệp `github-readme.html`, `js/render-readme.js`, `js/github.js`)
92+
93+
**Người dùng:** cái vấn biểu mẫu không hoạt ddooongj, có api key nào hoạt động miễn phí khhoong
94+
95+
**Gemini:** (Giải thích về Formspree và cách tích hợp)
96+
97+
**Người dùng:** https://formspree.io/f/xpwozknb đây là form của mình bạn chỉnh file contact nhé
98+
99+
**Gemini:** (Thực hiện tích hợp Formspree vào `contact.html`)
100+
101+
**Người dùng:** Vấn đề về Bảo trì & Hiệu suất trùng lặp mã js và header footer giải quyết bằng js bằng cách nào, nếu viết header cho từng file html còn khó bảo trì hơn là tạo sinh bằng js chứ
102+
103+
**Gemini:** (Giải thích giải pháp tái cấu trúc JavaScript thành `main.js`)
104+
105+
**Người dùng:** bạn hãy thực hiện đi
106+
107+
**Gemini:** (Thực hiện tái cấu trúc JavaScript)
108+
109+
**Người dùng:** mình mới test form ròi nó thật sự hoạt động, bạn kiểm tra assets/test-form.png nhé
110+
111+
**Gemini:** (Kiểm tra hình ảnh và xác nhận form hoạt động)
112+
113+
**Người dùng:** mình thấy nhiều bạn hãy custom cursor để mang dấu ấn cá nhân hay phong cách của họ, nhưng mà bạn lại nhìn nhận góc nhìn khác là gây khó chịu cho 1 số người dùng, rất may là trang portfolio này cũ, không dùng đến nữa, mà web hiện tại này tranhuudat2004.github.io nó thay đổi rất nhiều ròi, bạn check thử nhé
114+
115+
**Gemini:** (Cố gắng kiểm tra trang web trực tiếp nhưng gặp hạn chế với `web_fetch`)
116+
117+
**Người dùng:** thôi không sao, bây giờ bạn viết file GEMINI.md này để lưu lại cuộc trò chuyện này, mình sẽ mở project khác và tiếp tục cuộc trò chuyện tiếp đó nhé
118+
119+
**Gemini:** (Đang chuẩn bị tạo file GEMINI.md)
120+
121+
---
122+
123+
### Tiếp tục cuộc trò chuyện
124+
125+
**Người dùng:** chào bạn, hãy dùng file GEMINI.md và tiếp tục cuộc trò chuyện này nhé
126+
127+
**Gemini:** Tôi đã lưu lại cuộc trò chuyện của chúng ta vào file `GEMINI.md`.
128+
129+
Bạn muốn tôi làm gì tiếp theo với dự án này? Hoặc bạn muốn chuyển sang một dự án khác như bạn đã đề cập?

github_stats.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"HTML": 2,
3+
"JavaScript": 3,
4+
"CSS": 3,
5+
"C#": 1,
6+
"Python": 3,
7+
"Jupyter Notebook": 1,
8+
"ShaderLab": 1
9+
}

github_stats_explanation.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# Giải thích về github_stats.json
2+
3+
Tệp `github_stats.json` đóng vai trò là bộ đệm (cache) cho dữ liệu số liệu thống kê ngôn ngữ lấy từ API công khai của GitHub. Mục đích của nó là hiển thị động phần "Skills" (Kỹ năng) trên trang portfolio mà không phải liên tục gọi API của GitHub trực tiếp từ trình duyệt của người dùng.
4+
5+
## Mục đích
6+
7+
* **Tránh giới hạn tốc độ API (Rate Limiting):** Các yêu cầu không được xác thực đến API GitHub bị giới hạn nghiêm ngặt (ví dụ: 60 yêu cầu mỗi giờ). Bằng cách sử dụng tệp tĩnh, chúng ta loại bỏ sự phụ thuộc này, đảm bảo tính năng kỹ năng luôn tải được.
8+
* **Cải thiện hiệu suất tải trang:** Tải dữ liệu từ một tệp cục bộ nhanh hơn nhiều so với việc thực hiện yêu cầu mạng đến máy chủ GitHub.
9+
* **Tính ổn định:** Đảm bảo tính năng kỹ năng hoạt động độc lập với tình trạng sẵn có hoặc giới hạn của API GitHub.
10+
11+
## Cách tạo ra dữ liệu
12+
13+
Dữ liệu trong tệp này được thu thập bằng cách:
14+
15+
1. **Gửi yêu cầu API:** Thực hiện một lệnh gọi HTTP đến API GitHub: `https://api.github.com/users/tranhuudat2004/repos?per_page=100&sort=pushed`. Lệnh gọi này lấy về danh sách tất cả các kho lưu trữ (repository) công khai của người dùng `tranhuudat2004`.
16+
2. **Trích xuất ngôn ngữ chính:** Đối với mỗi kho lưu trữ trong danh sách trả về, chúng tôi đã trích xuất `language` chính được sử dụng trong kho đó.
17+
3. **Đếm số lần xuất hiện:** Chúng tôi đã đếm số lượng kho lưu trữ cho mỗi ngôn ngữ.
18+
19+
## Cấu trúc dữ liệu
20+
21+
Tệp `github_stats.json` là một đối tượng JSON đơn giản, nơi các khóa (keys) là tên của các ngôn ngữ lập trình và các giá trị (values) là số lượng kho lưu trữ GitHub công khai của bạn sử dụng ngôn ngữ đó làm ngôn ngữ chính.
22+
23+
**Ví dụ:**
24+
25+
```json
26+
{
27+
"HTML": 2,
28+
"JavaScript": 3,
29+
"CSS": 3,
30+
"C#": 1,
31+
"Python": 3,
32+
"Jupyter Notebook": 1,
33+
"ShaderLab": 1
34+
}
35+
```
36+
37+
* **"HTML": 2** có nghĩa là có 2 kho lưu trữ của bạn mà HTML là ngôn ngữ chính.
38+
* **"JavaScript": 3** có nghĩa là có 3 kho lưu trữ của bạn mà JavaScript là ngôn ngữ chính.
39+
40+
## Cách sử dụng
41+
42+
Tệp `js/scripts.js` sẽ đọc dữ liệu từ `github_stats.json` và sử dụng các giá trị này để tính toán phần trăm hiển thị trong các thanh kỹ năng. Mỗi số lượng kho lưu trữ sẽ cung cấp một "điểm thưởng" nhất định cho phần trăm hiển thị của kỹ năng tương ứng, tạo ra một màn hình kỹ năng sống động và phản ánh hoạt động phát triển thực tế của bạn trên GitHub.
43+
44+
## Cập nhật dữ liệu
45+
46+
Khi bạn có các kho lưu trữ mới hoặc cập nhật các kho lưu trữ hiện có và muốn phần "Skills" phản ánh những thay đổi đó, bạn sẽ cần phải:
47+
48+
1. **Chạy lại tập lệnh tạo `github_stats.json`:** Nếu có một tập lệnh tự động hóa việc này (ví dụ: một tập lệnh Python hoặc Node.js), bạn sẽ chạy nó. Hiện tại, quá trình này được thực hiện thủ công bởi trợ lý.
49+
2. **Cập nhật tệp:** Đảm bảo rằng tệp `github_stats.json` mới được tạo được đặt trong thư mục gốc của dự án.

0 commit comments

Comments
 (0)