เคยรู้สึกไหมว่า… พื้นที่ในคอมหายไปไหนหมด?
ผมเจอปัญหานี้บ่อยมาก เปิด Windows มา C: drive เหลือ 10GB แล้วก็งงว่า “อะไรกินพื้นที่ไปหมดวะ?”
เคยใช้ CCleaner, WinDirStat แต่รู้สึกว่า… เราน่าจะทำเองได้นะ?
และนี่คือจุดเริ่มต้นของ PCleaner 🎬
💡 ไอเดียเริ่มต้น
ต้องการโปรแกรมที่:
- วิเคราะห์ว่าอะไรกินพื้นที่ดิสก์
- ลบ cache browser ได้
- ลบ temp files ได้
- ไม่ลบอะไรพัง (สำคัญมาก!)
- หน้าตาดูดี ใช้งานง่าย
Tech stack ที่เลือก: Python + PyQt6
ทำไมถึงเลือก Python? ก็เพราะ… เขียนเร็ว debug ง่าย แล้วก็ build เป็น .exe ได้ด้วย PyInstaller
🤖 Vibe Coding กับ Claude
คราวนี้ไม่ได้เขียนคนเดียว แต่ใช้ Claude (AI) มาช่วย pair programming
วิธีทำงาน:
- บอก Claude ว่าอยากได้อะไร
- Claude วางแผน (สร้าง plan file)
- เริ่ม implement ทีละ phase
- เจอ bug → debug ด้วยกัน
- วนซ้ำจนเสร็จ
มันเหมือนมี senior developer นั่งข้างๆ ที่ไม่มีวัน tired และ จำทุกอย่างได้หมด 😂
🏗️ สิ่งที่สร้าง
Core Features
| Feature | Description |
|---|---|
| Disk Analyzer | สแกนดูว่าอะไรกิน space บ้าง แบบ tree view |
| System Cleaner | ลบ browser cache, temp files, recycle bin |
| Duplicate Finder | หาไฟล์ซ้ำด้วย hash comparison |
| Large File Finder | หาไฟล์ใหญ่ที่อาจไม่ได้ใช้แล้ว |
Browser Support
รองรับ 6 browsers:
- Chrome ✅
- Firefox ✅
- Edge ✅
- Brave ✅
- Opera ✅
- Vivaldi ✅
Safety Features
อันนี้สำคัญมาก ไม่อยากให้มันลบอะไรพัง:
PROTECTED_PATHS = [
"C:\\Windows",
"C:\\Program Files",
"C:\\Program Files (x86)",
# ... drive roots
]
และใช้ send2trash library เป็น default — ลบแล้วไปอยู่ถังขยะก่อน ไม่หายถาวร
🐛 ปัญหาที่เจอ (และแก้ยังไง)
ปัญหาที่ 1: App ค้างตอนติ๊กถูก Browser
อาการ: อยู่ใน Cleaner tab หลัง scan เสร็จ พอติ๊กถูกที่ browser checkbox → Not Responding 💀
สาเหตุ:
- ใช้
ItemIsAutoTristateflag ใน QTreeWidget - ทุกครั้งที่ติ๊ก มันจะ fire
itemChangedsignal หลายครั้ง - แต่ละครั้งเรียก
psutil.process_iter()ไปเช็คว่า browser รันอยู่ไหม process_iter()มัน ช้ามาก (ต้อง iterate ทุก process ในระบบ)
วิธีแก้:
# 1. Debounce timer - รอ 300ms ก่อนเช็ค
self._warning_check_timer = QTimer()
self._warning_check_timer.setSingleShot(True)
self._warning_check_timer.setInterval(300)
# 2. Process cache - cache ผลลัพธ์ไว้ 2 วินาที
self._process_cache: Optional[set] = None
self._process_cache_time: float = 0
self._process_cache_ttl: float = 2.0
ผลลัพธ์: จากค้าง 5-10 วินาที → ตอบสนองทันที ✨
ปัญหาที่ 2: Design ดูโบราณ
อาการ: UI มันดู… Windows XP? 😅
วิธีแก้: หา design inspiration มาให้ Claude ดู แล้วให้มันเขียน theme ใหม่
เปลี่ยนจาก default Qt style เป็น modern design:
- สี Olive Green (#7C8C4E) เป็น primary
- สี Gold (#D4A520) เป็น accent
- ปุ่มทรงยาว pill-shaped (border-radius: 20px)
- Card style แบบ rounded corners
# Before: ปุ่มเหลี่ยมๆ
QPushButton { border-radius: 4px; }
# After: ปุ่มโค้งมน สวยงาม
QPushButton { border-radius: 20px; padding: 12px 24px; }
ปัญหาที่ 3: SyntaxWarning ตอนรัน
อาการ:
SyntaxWarning: invalid escape sequence '\ '
สาเหตุ: docstring มี \\?\ (Windows long path prefix) แต่ไม่ได้ใช้ raw string
วิธีแก้: เปลี่ยน """ เป็น r"""
# Before
def to_long_path(path: str) -> str:
"""
Path with \\?\ prefix if needed
"""
# After
def to_long_path(path: str) -> str:
r"""
Path with \\?\ prefix if needed
"""
เรื่องเล็กๆ แต่ถ้าไม่รู้ก็งงได้ 🤷
📦 Build & Distribution
สร้าง Standalone EXE
ใช้ PyInstaller สร้าง .exe ไฟล์เดียว:
pyinstaller PCleaner.spec --noconfirm
ได้ไฟล์ PCleaner.exe ขนาด ~40 MB
- รันได้เลย ไม่ต้อง install Python
- ส่งให้เพื่อนได้เลย
สร้าง Installer (Optional)
ใช้ Inno Setup สร้าง installer สวยๆ:
- มี Start Menu shortcut
- มี Desktop shortcut
- มี Uninstaller
- ดูโปรกว่า 😎
🎨 Icon
ใช้ AI generate icon มา แล้วแปลงเป็น .ico ด้วย Python:
from PIL import Image
img = Image.open('icon.png')
sizes = [(16,16), (32,32), (48,48), (64,64), (128,128), (256,256)]
img.save('icon.ico', format='ICO', sizes=sizes)
ง่ายมาก!
📊 สรุป Project Structure
PCleaner/
├── main.py # Entry point
├── app/
│ ├── core/
│ │ ├── scanner.py # Disk scanning (parallel)
│ │ ├── cleaner.py # System cleaning
│ │ ├── duplicate_finder.py
│ │ ├── large_file_finder.py
│ │ ├── safe_delete.py # Safe deletion
│ │ └── browser_paths.py
│ ├── ui/
│ │ ├── main_window.py
│ │ ├── disk_analyzer_tab.py
│ │ ├── cleaner_tab.py
│ │ ├── duplicate_tab.py
│ │ ├── large_files_tab.py
│ │ ├── settings_tab.py
│ │ └── themes.py
│ └── config/
│ ├── settings.py
│ └── constants.py
├── assets/
│ └── icon.ico
├── PCleaner.spec # PyInstaller config
├── installer.iss # Inno Setup script
└── build.bat # One-click build
🤔 สิ่งที่ได้เรียนรู้
1. AI เป็น Multiplier ไม่ใช่ Replacement
Claude ช่วยเขียน code ได้เร็วมาก แต่ยังต้อง:
- บอกทิศทางที่ชัดเจน
- ตรวจสอบ output
- Debug เมื่อมีปัญหา
- ตัดสินใจ design decisions
2. Premature Optimization is Evil
ตอนแรก focus ที่ทำให้มัน work ก่อน
แล้วค่อยมา optimize เมื่อเจอปัญหาจริง (เช่น UI freeze)
3. Cache Everything Expensive
psutil.process_iter() ช้า → cache มัน
Disk scan ช้า → ใช้ threading
UI update ช้า → ใช้ debounce
4. Safety First
สำหรับโปรแกรมที่ลบไฟล์ ต้องระวังมาก:
- Protected paths list
- send2trash เป็น default
- Confirmation dialog
- Audit logging
🚀 Next Steps?
ถ้ามีเวลา อาจจะเพิ่ม:
- [ ] Scheduled cleaning (ทำความสะอาดอัตโนมัติ)
- [ ] More detailed reports
- [ ] Startup manager
- [ ] Registry cleaner (อันนี้ต้องระวังมาก)
💬 Final Thoughts
ใช้เวลาประมาณ 1 วัน จาก idea → working app → distributable .exe
ถ้าเขียนคนเดียวไม่มี AI ช่วย คงใช้เวลา 1-2 สัปดาห์
นี่คือพลังของ Vibe Coding — บอกสิ่งที่ต้องการ แล้วให้ AI ช่วย implement
แต่สุดท้าย ยังต้องเข้าใจว่ามันทำงานยังไง เพื่อที่จะ debug และ improve ได้
Happy Coding! 🎉
ถ้าสนใจ source code หรืออยากลองใช้ บอกได้นะครับ

