Appearance
Thực thi Code
Hệ thống LMS có một sandbox thực thi code chạy trên máy chủ, cho phép bạn viết và chạy code trực tiếp trong trình duyệt mà không cần cài đặt bất kỳ phần mềm nào trên máy tính cá nhân. Trang này mô tả tổng quan về cơ chế thực thi, ngôn ngữ hỗ trợ, các giới hạn kỹ thuật, và các loại lỗi runtime bạn có thể gặp.
Để hiểu cách các loại hoạt động lập trình cụ thể vận hành, xem (tên in đậm là tên loại hoạt động hiện trên giao diện khoá học):
- Code Practicing — có test cases, chấm tự động
- Code Interactive — sandbox tự do, không chấm
- Code Terminal Exercise — chạy code, so đầu ra với đáp án mong đợi
- Code Reading — quan sát code mẫu
- Code Inspection — AI hướng dẫn debug/review
Code Playground
Code Playground là widget thực thi code có thể được nhúng trực tiếp vào nội dung bài đọc hoặc bài giảng. Khác với các activity lập trình độc lập, playground:
- Không tính tiến độ — chạy bao nhiêu lần cũng được, không ảnh hưởng đến hoàn thành bài
- Không có test case — chỉ chạy và xem output
- Có thể có nhiều file — playground hỗ trợ project nhiều file (vd:
main.py+utils.py) - Có thể có sẵn code mẫu — giảng viên đặt code khởi đầu để bạn quan sát hoặc chỉnh sửa
Sử dụng
- Mở bài học có Code Playground (thường nhúng trong bài đọc).
- Quan sát code mẫu (nếu có) hoặc viết code mới vào editor.
- Nếu playground có nhiều file, chuyển file qua tab tên file ở phía trên editor.
- Nhấn Chạy (
▶) — kết quả hiển thị bên dưới editor. - (Tùy chọn) Nhấn icon Toàn màn hình để mở rộng editor.
TIP
Playground là chỗ tốt để thử nhanh ý tưởng trong khi đang đọc bài lý thuyết. Bạn không bị tính lượt thử và không có áp lực pass/fail.
Ngôn ngữ hỗ trợ
Sandbox của hệ thống hỗ trợ các ngôn ngữ sau:
| Ngôn ngữ | Phiên bản | Ghi chú |
|---|---|---|
| Python | 3.11 | Standard library; không có numpy/pandas/scipy mặc định |
| JavaScript / Node.js | Node 20 | Standard Node API; không có thư viện npm bên ngoài |
| PHP | 8.2 (CLI) | Chạy ở chế độ CLI, không phải web request |
| Java | OpenJDK 21 | Tự động javac rồi java — chỉ cần nộp source .java |
Tùy hoạt động cụ thể, giảng viên có thể cố định một ngôn ngữ (vd: Code Practicing chỉ cho Python). Trong Code Playground, ngôn ngữ thường do nội dung bài học quyết định.
WARNING
Một số bài giảng minh họa cú pháp C# / Go / Ruby / Rust / Kotlin / Swift chỉ ở dạng đọc code (Code Reading) hoặc dạng pseudo-code — bạn không thể chạy chúng trong sandbox.
C / C++ chạy được hay không tuỳ hệ thống của tổ chức bạn. Nếu bài yêu cầu chạy C/C++ mà nút Chạy báo lỗi hệ thống, hãy báo giảng viên.
Trình soạn thảo (Editor)
Editor sử dụng Monaco — engine của VS Code — với các tính năng:
- Syntax highlight theo ngôn ngữ
- Auto-completion + IntelliSense cơ bản
- Bracket matching, multi-cursor, find & replace
- Theme sáng/tối, đồng bộ với theme LMS
- Các phím tắt phổ biến của VS Code:
Ctrl/Cmd+/(comment),Ctrl/Cmd+D(chọn từ trùng),Ctrl/Cmd+F(tìm),Alt+↑/↓(di chuyển dòng)
Code bạn gõ trong editor được chạy ở máy chủ, không chạy trong trình duyệt. Trình duyệt chỉ chịu trách nhiệm hiển thị editor + gửi code lên server qua Livewire.
Cách sandbox hoạt động
Mỗi lần nhấn Chạy / Submit, hệ thống thực hiện các bước:
- Đóng gói code của bạn (cùng các file đi kèm) thành thư mục tạm trên máy chủ.
- Khởi tạo một container Docker biệt lập với resource limit (xem mục Giới hạn).
- Mount thư mục code vào
/codetrong container. - Thực thi lệnh tương ứng với ngôn ngữ:
- Python:
python /code/main.py - Node:
node /code/main.js - PHP:
php /code/main.php - Java:
javac /code/Main.java && java -cp /code Main
- Python:
- Thu lại stdout + stderr + exit code, gửi về trình duyệt.
- Xóa container và toàn bộ file tạm — không lưu lại dấu vết thực thi.
Vì sao sandbox hóa
Cô lập đảm bảo: code bạn viết không thể đụng vào hệ thống file thật, không thể truy cập tài nguyên của user khác, và bị tự động dừng nếu chạy quá lâu hoặc tốn quá nhiều bộ nhớ.
Giới hạn kỹ thuật
| Giới hạn | Giá trị mặc định |
|---|---|
| Thời gian chạy | 5 giây mỗi lần thực thi |
| Bộ nhớ (RAM) | 128 MB |
| CPU | 0.5 core |
| Mạng (network) | Tắt hoàn toàn — không thể gọi API ngoài, không tải file từ internet |
| Hệ thống file | Chỉ ghi được trong /code và /tmp của container; bị xóa sau khi chạy xong |
| Đầu vào (stdin) | Hỗ trợ — nhập input thủ công ở ô bên dưới editor (nếu hoạt động cho phép) |
Hệ quả thực tế
- Code không thể
requests.get(...)/fetch(...)/curlra internet. - Không thể
pip install/npm installthêm thư viện trong khi chạy — chỉ có standard library sẵn của ngôn ngữ. - File bạn ghi (vd:
open('output.txt', 'w')) sẽ bị xóa khi container kết thúc. - Time/Memory ở Code Practicing có thể được giảng viên thiết lập riêng cho từng bài; ở Code Interactive thường nới lỏng hơn (10–30s).
Chạy quá nhanh bị chặn
Để sandbox không bị quá tải, mỗi người chỉ được chạy code một số lần nhất định trong một phút. Bấm Chạy liên tục quá giới hạn này, bạn sẽ thấy:
Bạn đã chạy quá nhiều lần trong một phút. Thử lại sau … giây.
Đây không phải lỗi code của bạn. Đợi đúng số giây được báo rồi chạy lại. Trong bài lập trình có chấm, lượt bị chặn không bị tính là một lần nộp.
Đầu vào & đầu ra (I/O)
Standard output
print(...) (Python), console.log(...) (JS), echo (PHP), System.out.println(...) (Java) — tất cả đều ghi ra stdout và hiển thị ở panel kết quả.
Standard error
Exception, traceback, lỗi biên dịch ghi ra stderr và hiển thị tách biệt (thường có nhãn Stderr hoặc tô đỏ). Khi code có lỗi, luôn đọc stderr trước — đó là chỗ thông tin quan trọng nhất.
Standard input
Nếu hoạt động cho phép nhập input, bạn sẽ thấy ô Input bên dưới (hoặc bên cạnh) editor. Mỗi dòng bạn gõ sẽ được đẩy vào stdin của chương trình:
- Python:
input()đọc một dòng - Node: dùng
readlinehoặc đọc từprocess.stdin - PHP:
fgets(STDIN) - Java:
Scanner sc = new Scanner(System.in); sc.nextLine();
Trong Code Practicing, input được hệ thống tự động cấp từ test case — bạn không cần gõ thủ công.
So sánh output (output matching)
Trong Code Practicing và một số playground có expected output, hệ thống so sánh output của bạn với output chuẩn để quyết định Pass/Fail:
- So sánh chính xác sau khi
trim()cuối — nghĩa là một dấu cách thừa giữa dòng vẫn fail. - Phân biệt hoa/thường —
Hello≠hello. - Mỗi dòng kết thúc bằng
\n— đa số ngôn ngữ tự thêm khiprintln/print(mặc định). - Không có encoding lạ — luôn đảm bảo file source là UTF-8.
Nếu Pass tại nhà mà Fail trên LMS
- Khoảng trắng/dòng mới thừa trong output (vd:
print("a "); print("b")ra"a b\n"thay vì"a\nb"). - Code dùng feature ngôn ngữ ở phiên bản mới hơn sandbox (vd: Python 3.12 syntax trên sandbox 3.11).
- Encoding khác (UTF-8 vs Latin-1) cho input/output.
- Dùng thư viện không có trong standard library.
Các loại lỗi runtime
Khi chạy code, bạn có thể gặp các trạng thái sau:
| Mã | Tên đầy đủ | Nguyên nhân |
|---|---|---|
| AC | Accepted | Output đúng với expected |
| WA | Wrong Answer | Code chạy xong nhưng output sai |
| TLE | Time Limit Exceeded | Code chạy quá thời gian cho phép |
| MLE | Memory Limit Exceeded | Code dùng quá bộ nhớ cho phép |
| RE | Runtime Error | Exception/crash trong khi chạy (ZeroDivisionError, NullPointerException, …) |
| CE | Compilation Error | Java/C++ không biên dịch được — sai cú pháp |
Khi gặp TLE
- Nghĩ về độ phức tạp thuật toán: vòng
forlồng → O(n²) có thể quá chậm với n lớn. - Ưu tiên dictionary/set thay cho list khi cần lookup —
O(1)thayO(n). - Tránh đọc input dòng-từng-dòng nếu input lớn — đọc gộp một lần.
Khi gặp MLE
- Tránh tạo list/array khổng lồ nếu không cần.
- Dùng generator/lazy evaluation (Python:
yield). - Giải phóng tham chiếu khi không dùng (đặt biến = None).
Khi gặp RE
- Đọc kỹ traceback / stack trace — dòng cuối thường chỉ chính xác chỗ lỗi.
- Kiểm tra edge case: input rỗng, n=0, chia cho 0, index ra ngoài mảng.
Khi gặp CE (Java)
- Kiểm tra tên class trùng tên file (vd:
class Mainthì file phải làMain.java). - Thiếu
;, sai khai báo type, import sai package.
Bảo mật & quyền riêng tư
- Code bạn viết được lưu vào tài khoản (auto-save) ở Code Interactive / Code Practicing — bạn quay lại vẫn thấy code cũ.
- Quá trình thực thi không log code của bạn ra file lâu dài; chỉ log metadata (tên user, activity, thời gian, trạng thái pass/fail) để chấm điểm và phục vụ thống kê tiến độ.
- Sandbox cách ly mạng → code không thể "thoát" ra ngoài để gọi API hay tải file.
Mẹo chung khi viết code trên LMS
- Test edge cases trước khi submit — n=0, n=1, input rỗng, input cực lớn.
- In ra để debug —
print(debug_value)rồi xóa trước khi submit. Output thừa có thể fail expected output. - Đọc đề kỹ — đặc biệt format output: có dấu chấm cuối câu? có dòng trống? phân tách bằng dấu phẩy hay dấu cách?
- Đừng hard-code đáp án cho test public — hidden test sẽ phát hiện.
- Chạy thử với input cực hạn — nếu chạy quá 1–2 giây cho input nhỏ, sẽ TLE với input lớn hơn.
- Lưu nháp ra ngoài — nếu code quan trọng, copy về máy hoặc Gist riêng. Sandbox không phải kho lưu trữ.
Câu hỏi thường gặp
Code chạy đúng trên máy tôi nhưng fail trên LMS? Nguyên nhân thường gặp: khác phiên bản ngôn ngữ, dùng thư viện không có trong sandbox, khác encoding I/O, hoặc output có khoảng trắng/xuống dòng thừa. Xem So sánh output.
Tôi có thể pip install / npm install thêm thư viện không? Không. Sandbox bị tắt mạng và không lưu trạng thái giữa các lần chạy. Chỉ dùng được standard library. Nếu khóa học cần thư viện cụ thể (vd: numpy), giảng viên phải bật pre-installed images riêng — hỏi giảng viên nếu thiếu.
Hiện ngôn ngữ tôi cần (Go, Rust, C#, Ruby, …) thì sao? Sandbox chạy Python, JavaScript/Node, PHP, Java (và C/C++ tuỳ tổ chức). Các ngôn ngữ khác chỉ xuất hiện ở dạng đọc code hoặc pseudo-code. Phản hồi với giảng viên hoặc admin nếu bạn cần thêm ngôn ngữ.
Tôi muốn nộp file đính kèm thay vì dán code? Code Playground / Code Practicing không hỗ trợ upload file. Nếu cần nộp file, dùng Bài tập (Assignment).
Tôi nhấn Chạy nhưng không thấy output gì cả?
- Code chưa thực sự gọi
print()(Python) /console.log()(JS). - Code throw exception trước khi đến
print— kiểm tra tab Stderr. print()đặt sau một vòng lặp vô hạn → bị TLE → không kịp in.- Output bị buffer (hiếm với 4 ngôn ngữ trên) — thử thêm
sys.stdout.flush()(Python).
Code playground có lưu code tự động không? Có ở Code Interactive / Code Practicing (gắn với tài khoản học viên). Code Playground nhúng trong bài đọc thường không lưu giữa các lần truy cập — copy ra ngoài nếu muốn giữ.