Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
db46543
create demo yml
dynsnsky Dec 12, 2024
d819564
up date Dead Links Check
dynsnsky Dec 15, 2024
f8d186c
Update dlinkscheck.yml
dynsnsky Dec 15, 2024
ff807bc
Update dlinkscheck.yml
dynsnsky Dec 29, 2024
067fbc7
update check deadlinks
dynsnsky Feb 16, 2025
06c6dcb
Delete .github/workflows/dlinkscheck.yml
dynsnsky Feb 17, 2025
237512e
Delete .github/workflows/list_url.py
dynsnsky Feb 17, 2025
5c3c058
Delete .github/workflows/check_urls.py
dynsnsky Feb 18, 2025
dd53105
Add files via upload
dynsnsky Feb 18, 2025
6ad8891
Update check_urls.py
dynsnsky Feb 18, 2025
c68a0ba
Updated new course description: IT010
dynsnsky Feb 21, 2025
1cac7ba
Add files via upload
dynsnsky Feb 21, 2025
ebbe13e
Update IT010.md
dynsnsky Feb 21, 2025
735e189
Update IT010.md
dynsnsky Feb 21, 2025
83811d5
Update IT010.md
dynsnsky Feb 21, 2025
65029a0
Update IT010
dynsnsky Feb 21, 2025
29484a1
Merge remote-tracking branch 'origin/main' into KyDuyen
dynsnsky Feb 21, 2025
55e3df7
update check deadlinks
dynsnsky Feb 24, 2025
bd8b49a
Delete broken_urls.txt
dynsnsky Feb 24, 2025
ba0669c
Delete check_urls.py
dynsnsky Feb 24, 2025
7afe745
Delete .github/workflows/check-deadlinks.yml
dynsnsky Feb 24, 2025
548435d
Update check_links.py
dynsnsky Feb 24, 2025
4c922f7
Update check_links.py
dynsnsky Feb 24, 2025
f4d53d8
Delete docs/MonHocCoSoNganh/IT010.md
dynsnsky Feb 24, 2025
b51635c
Update link_checker.yml
dynsnsky Feb 24, 2025
c885c71
Merge branch 'main' of https://github.com/SVUIT/mmtt into KyDuyen
dynsnsky May 11, 2025
903f7cb
Create MonHocTotNghiep
VietHoang-206 May 21, 2025
a5862e7
Add SE501 SE405 SE401 SE400 SE358 SE357 SE310
May 21, 2025
bd7d53a
Add SE501 SE405 SE401 SE400 SE358 SE357 SE310
May 21, 2025
ceb3aae
Add files via upload
dynsnsky Jun 14, 2025
4f762ce
Merge pull request #256 from SVUIT/KyDuyen
VietHoang-206 Jun 16, 2025
378070d
Update new location of subject
Jun 16, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions .github/workflows/link_checker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: Check Broken Links

on:
schedule:
- cron: "0 19 * * 2" # Runs every Tuesday at 19:00 UTC
workflow_dispatch:

jobs:
check_links:
runs-on: ubuntu-latest
steps:
- name: 📥 Checkout repository
uses: actions/checkout@v3

- name: 🛠 Debug - List files (Check if file exists)
run: ls -lah

- name: 🛠 Grant access to the script
run: chmod +x check_links.py

- name: 🔧 Setting Python
uses: actions/setup-python@v3
with:
python-version: '3.x'

- name: 📦 Install lib
run: pip install requests

- name: 🔍 Run script
env:
ISSUE_API: ${{ secrets.ISSUE_API }}
run: python check_links.py
132 changes: 132 additions & 0 deletions check_links.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
import os
import re
import requests
from urllib.parse import urljoin
# Folder containing markdown files
folder_path = "./docs"
# Original URL of the website
base_url = "https://svuit.org/mmtt/docs"
# GitHub repo details
GITHUB_REPO = os.getenv("GITHUB_REPOSITORY")
GITHUB_TOKEN = os.getenv("ISSUE_API")

# Browser emulation header to avoid blocking
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}

def get_urls_from_folder(folder_path, base_url):
"""Get a list of URLs from markdown files in a directory."""
urls = []
for root, _, files in os.walk(folder_path):
for file in files:
if file.endswith(".md"):
relative_path = os.path.relpath(root, folder_path).replace("\\", "/")
url_path = os.path.join(relative_path, file).replace("\\", "/")
url = f"{base_url}/{url_path}".replace(".md", ".html")
urls.append(url)
return urls

def extract_urls_from_markdown(file_path, base_url):
"""Extract all URLs from Markdown file, keeping anchor (#) intact."""
links = []
link_pattern = r"\[.*?\]\((.*?)\)"

# Get the original URL of the current markdown file
relative_path = os.path.relpath(file_path, folder_path).replace("\\", "/")
base_file_url = f"{base_url}/{relative_path}".replace(".md", ".html")

try:
with open(file_path, "r", encoding="utf-8") as file:
content = file.read()
matches = re.findall(link_pattern, content)
for match in matches:
if match.startswith(("http://", "https://")):
full_url = match
elif match.startswith("#"):
full_url = base_file_url + match # Link anchor
elif match.startswith("/"):
full_url = urljoin(base_url, match)
else:
full_url = urljoin(base_file_url, match)

links.append(full_url)
except Exception as e:
print(f"⚠️Error reading {file_path}: {e}")
return links

def check_url(url):
"""Check if the URL works."""
try:
response = requests.head(url, timeout=10, headers=HEADERS, allow_redirects=True)
if 404 <= response.status_code <= 500:
return False, response.status_code
return True, response.status_code
except requests.RequestException as e:
return False, str(e)

def create_github_issue(broken_urls):
"""Create an issue on GitHub with a list of broken links."""
print(f"GITHUB_REPOSITORY: {os.getenv('GITHUB_REPOSITORY')}")
print(f"ISSUE_API: {'Found' if os.getenv('ISSUE_API') else 'Not found'}")

if not GITHUB_TOKEN or not GITHUB_REPO:
print("⚠️GITHUB_TOKEN or GITHUB_REPOSITORY not found. Abandoning issue creation.")
return

issue_title = "🚨 Broken Links Detected!"
issue_body = "List of broken links detected:\n\n"
for error in broken_urls:
issue_body += f"- {error}\n"

url = f"https://api.github.com/repos/{GITHUB_REPO}/issues"
headers = {
"Authorization": f"token {GITHUB_TOKEN}",
"Accept": "application/vnd.github.v3+json"
}
data = {
"title": issue_title,
"body": issue_body,
"labels": ["broken-links"]
}

response = requests.post(url, json=data, headers=headers)
if response.status_code == 201:
print("✅Issue created successfully!")
else:
print(f"❌Error creating issue: {response.status_code} - {response.text}")

if __name__ == '__main__':
print("Collecting list of URLs from directories...")

folder_urls = get_urls_from_folder(folder_path, base_url)
markdown_links = []

for root, _, files in os.walk(folder_path):
for file in files:
if file.endswith(".md"):
file_path = os.path.join(root, file)
markdown_links.extend(extract_urls_from_markdown(file_path, base_url))

all_urls = list(set(folder_urls + markdown_links))

broken_urls = []
total_count = len(all_urls)
checked_count = 0

print(f"🔗Total number of URLs to check: {total_count}")

for url in all_urls:
checked_count += 1
print(f"({checked_count}/{total_count}) Check: {url} ...", end=" ")
is_available, status = check_url(url)
if not is_available:
print(f"❌ERROR ({status})")
broken_urls.append(f"{url} ➝ Error: {status}")
else:
print(f"✅Work ({status})")

if broken_urls:
create_github_issue(broken_urls)
else:
print("\n🎉All URLs are valid!")
49 changes: 49 additions & 0 deletions docs/MonHocTuChon/CNPM/SE005.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
---
layout: default
title: SE005 - Giới Thiệu Ngành Kỹ Thuật Phần Mềm
nav_order: 3
parent: Khoa CNPM
---

# SE005 - Giới Thiệu Ngành Kỹ Thuật Phần Mềm

*Ngày cập nhật của folder Google Drive: 24-04-2025*
## Tài liệu môn học

[Folder Drive](https://drive.google.com/drive/folders/1110qSw006JxLZ9XUY4a6kaSt4EMn3nl3?usp=drive_link){:target="_blank" : .btn .btn-primary .btn-gg-drive .fs-5 .mb-4 .mb-md-0 .mr-2 }

## Mô tả môn học

### Số tín chỉ: 1

### Điều kiện đăng ký

| Môn học trước| Môn học tiên quyết |
|------|-----|
| <center>-</center>| <center>-</center>|

### Hệ số điểm
| Quá Trình | Cuối Kì |
|------|-----|
| <center> 0.5 </center>| <center>0.5 </center> |

### Lý thuyết

### Thực hành
Không có
### Đồ án
- Đồ án được thực hiện theo nhóm, mỗi nhóm thiểu 3-6 thành viên.
- Trong 1 nhóm lớp mỗi nhóm 1 đề tài khác nhau.
- Thực hiện đề tài gồm 2 sản phẩm cho chủ đề đã đăng ký:

(Làm việc nhóm có phân công rõ ràng: 1 điểm)

- 01 Quyển báo cáo (Hình thức 1 điểm, Nội dung báo cáo 2 điểm)
- 01 Bài thuyết trình:
- Biên bản thuyết trình: 1 điểm
- Slide thuyết trình: 2 điểm
- Kỹ năng thuyết trình: 3 điểm

### Hình thức thi
Trình bày báo cáo, bài thuyết trình
## Thông tin khác
63 changes: 63 additions & 0 deletions docs/MonHocTuChon/CNPM/SE100.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
---
layout: default
title: SE100 - Phương pháp Phát triển phần mềm hướng đối tượng
nav_order: 3
parent: Khoa CNPM
---

# SE100 - Phương pháp Phát triển phần mềm hướng đối tượng

*Ngày cập nhật của folder Google Drive: 24-04-2025*
## Tài liệu môn học

[Folder Drive](https://drive.google.com/drive/folders/10ZdBLKJsXqsLb2mQyvBXKvMz9I1LDMzl?usp=drive_link){:target="_blank" : .btn .btn-primary .btn-gg-drive .fs-5 .mb-4 .mb-md-0 .mr-2 }

## Mô tả môn học
Môn học này thuộc khối kiến thức cơ sở ngành và trình bày về phát triển phần
mềm theo phương pháp hướng đối tượng. Nội dung môn học tập trung chính vào
phương pháp và kỹ thuật liên quan đến hoạt đọng phân tích và thiết kế hệ thống
phần mềm theo phương pháp hướng đối tượng một cách hiệu quả. Thông qua
môn học, sinh viên sẽ được áp dụng các kiến thức môn học vào dự án mang tính
ứng dụng cao và xây dựng được ứng dụng hoàn chỉnh. Ngoài ra, sinh viên còn
được tăng cường kỹ năng làm việc nhóm, kỹ năng giải quyết vấn đề, kỹ năng viết
báo cáo, kỹ năng trình bày,...

### Số tín chỉ: 4
- Lí thuyết: 3
- Thực hành: 1

### Điều kiện đăng ký

| Môn học trước| Môn học tiên quyết |
|------|-----|
| <center>SE104, IT008 </center>| <center>-</center>|

### Hệ số điểm
| Bài Tập + Seminar + Đồ Án | Cuối Kì (Thi lí thuyết) |
|------|-----|
| <center> 0.5 </center>| <center>0.5 </center> |

### Lý thuyết
### Thực hành
#### CÁC CÔNG CỤ HỖ TRỢ THỰC HÀNH
1. Các công cụ hỗ trợ lập trình nền tảng .Net, hoặc Java hoặc Mobile, Web,...
2. Các công cụ quản lý mã nguồn và CI/CD.
3. Các công cụ về diagram (Rational Rose, Star UML, Lucidchart, Visual
Paradigm ..)

### Đồ án
##### KHÔNG CÓ

### Hình thức thi

## Tài liệu tham khảo
1. Dive Into Design Patterns, Alexander Shvets, 2019.
2. Object-Oriented Analysis and Design for Information Systems, Raul Sidnei
Wazlawick, 2014.
3. Yogesh Singh (Author), Ruchika Malhotra (Author). Object-Oriented
Software Engineering. Learning Private Limited, 2012.
4. Hassan Gomaa, Software Modeling and Design: UML, Use Cases, Patterns,
and Software Architectures. Cambridge University Press, 2011.
5. Stephen Schach, Vanderbilt University. Object-Oriented and Classical
Software Engineering. Mc Graw Hill, 2010.
6. Ian Sommerville, Software Engineering. Addison Wesley, 2010.
51 changes: 51 additions & 0 deletions docs/MonHocTuChon/CNPM/SE104.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
---
layout: default
title: SE104 - NHẬP MÔN CÔNG NGHỆ PHẦN MỀM
nav_order: 3
parent: Khoa CNPM
---

# SE104 - NHẬP MÔN CÔNG NGHỆ PHẦN MỀM
*Ngày cập nhật của folder Google Drive: 24-04-2025*
## Tài liệu môn học

[Folder Drive](https://drive.google.com/drive/folders/1bXZ2PjKs_RZkqAPtkgkdVq43hvG-Qx-c?usp=drive_link){:target="_blank" : .btn .btn-primary .btn-gg-drive .fs-5 .mb-4 .mb-md-0 .mr-2 }

## Mục tiêu môn học
- Tổng quan về Công nghệ phần mềm
- Xác định và mô hình hóa yêu cầu phần mềm
- Thiết kế phần mềm
- Cài đặt phần mềm
- Kiểm thử và bảo trì
- Đồ án môn học

### Số tín chỉ: 4
- Lí thuyết: 3
- Thực hành: 1

### Điều kiện đăng ký

| Môn học trước| Môn học tiên quyết |
|------|-----|
| <center>IT002, IT004</center>| <center>-</center>|

### Hệ số điểm
| Quá Trình | Cuối Kì (Đồ Án) |
|------|-----|
| <center> 0.3 </center>| <center>0.7 </center> |

### Lý thuyết

### Thực hành

### Đồ án
Thời gian thực hiện: 8 tuần.
- Giới thiệu các bài toán cần giải quyết và mô tả quy trình thực hiện các công việc chính
- Xác định và mô hình hóa yêu cầu phần mềm
- Thiết kế hệ thống
- Thiết kế dữ liệu
- Thiết kế giao diện
- Cài đặt
- Kiểm chứng

## Thông tin khác
Loading