Chào bạn! Bạn có bao giờ tự hỏi điều gì làm cho những người lập trình viên trở nên… khác biệt không? Chúng tôi không chỉ đơn thuần là những cỗ máy gõ code, tuân thủ mệnh lệnh và cho ra sản phẩm đâu nhé. À mà đôi khi cũng có, nhưng chủ yếu, chúng tôi là những người giải quyết vấn đề đầy sáng tạo, những "kiến trúc sư số" đang từng ngày xây dựng nên thế giới kỹ thuật số mà bạn đang sống, đang làm việc và giải trí đấy.Bạn có bao giờ thắc mắc tại sao một ứng dụng nào đó lại mượt mà đến thế, hay một trang web lại dễ dùng đến không ngờ? Đó chính là dấu ấn của những người lập trình viên tụi mình. Thường thì, chúng tôi sẽ "xẻ" những thử thách phức tạp nhất thành từng mảnh nhỏ, rồi từ đó "dệt" nên những giải pháp tinh tế, đẹp mắt.Đúng là code là ngôn ngữ của chúng tôi, nhưng tâm trí chúng tôi lúc nào cũng rộn ràng với những ý tưởng mới. Thậm chí, đôi khi đang tắm, hay đang xem một bộ phim hay ho, chúng tôi cũng vô thức nghĩ về… dòng code còn dang dở hoặc một bug "khó nhằn" nào đó. Cái khao khát học hỏi và cải thiện mọi thứ dường như đã ăn sâu vào máu rồi. Công nghệ mới à? Cứ như món đồ chơi bóng bẩy vậy, chúng tôi chỉ muốn nhảy vào "vọc vạch" ngay lập tức để xem nó làm được gì!Nhưng có một điều này, làm lập trình viên không có nghĩa là bạn phải "cắm mặt" vào code 24/7 đâu. Mà nó là về việc tìm được một "chỗ trốn" thật tuyệt vời ngay trong chính những dòng code đó, nơi bạn được đắm chìm vào thứ mình thực sự yêu thích. Có thể người ngoài nghĩ chúng tôi chỉ biết nói chuyện code, nhưng thật ra đó là vì… chúng tôi quá đam mê! Chúng tôi muốn chia sẻ kiến thức, chia sẻ cái cảm giác sung sướng khi xây dựng được một thứ gì đó "siêu ngầu" mà thôi.Hãy nghĩ về chúng tôi như những… nghệ sĩ đi! Chúng tôi tạo ra những "kiệt tác" đầy tính năng bằng từng dòng code. Chúng tôi tự hào không chỉ khi mọi thứ hoạt động trơn tru, mà đôi khi còn tự hào khi… tạo ra những lỗi thật "đẹp" nữa cơ (đùa tí thôi nhé!). Có thể bạn cho rằng tôi đang "lãng mạn hóa" nghề lập trình, nhưng thực sự thì, đây không phải là một công việc bình thường đâu. Nó khác biệt, rất rất khác biệt!<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/programmer_as_artist.png' alt='Lập trình viên - những nghệ sĩ của thế giới số'>Này, bạn đã bao giờ có những "suy nghĩ trong phòng tắm" về đoạn code của mình chưa? Kiểu như đang gội đầu mà tự nhiên "À há! Mình biết cách sửa cái lỗi kia rồi!" hay "Làm sao để tối ưu đoạn này nhỉ?". Cái "mặt tối" của việc lập trình đôi khi len lỏi vào cả cuộc sống xã hội của chúng ta lúc nào không hay. Đến mức, bạn không thể phủ nhận nó là một phần của mình nữa rồi.Tôi có một cậu bạn học kinh tế. Mỗi khi gặp nhau, tôi lại hào hứng kể về chuyện mình đã "phá đảo" bao nhiêu bài LeetCode, hay làm thế nào để sửa được một bug "siêu to khổng lồ" trên hệ thống đang chạy. Rồi còn chuyện hóa đơn Cloud "sương sương" hàng tháng nữa chứ. Bạn tôi giờ còn biết cả những "công nghệ mới bóng bẩy" vừa xuất hiện trong hệ sinh thái JavaScript – tất cả cũng tại tôi mà ra cả!Tôi cũng từng có những cuộc trò chuyện "đi vào lòng đất" với bạn bè, nơi tôi thao thao bất tuyệt về config Neovim của mình, về tmux, và tại sao Arch Linux lại là "vua" của mọi bản phân phối Linux. Tôi còn khoe khoang mình đã quản lý năng suất làm việc hiệu quả đến mức nào với mớ config đó, và cách mỗi đoạn script "ăn khớp" ra sao với quy trình làm việc của tôi. Rồi nào là triết lý của Unix, cách Arch Linux được xây dựng tỉ mỉ thế nào… Bla bla… Tôi dám chắc là cậu bạn tôi chẳng hiểu một từ nào về Linux đâu. Mà nghĩ lại thì, hình như cậu ấy còn chẳng có… máy tính để bàn nữa cơ! Nhưng thôi, chắc bạn cũng hiểu ý tôi rồi phải không?<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/shower_thoughts_code.png' alt='Ý tưởng lập trình bất chợt trong phòng tắm'>Chuyện gì cũng xoay quanh lập trình: Đôi khi tôi cảm thấy mình có ít bạn bè hơn vì bất cứ thứ gì nảy ra trong đầu tôi đều liên quan đến lập trình. Tại sao lại thế nhỉ? Chẳng lẽ tôi không có cuộc sống riêng sao?Chắc hẳn bạn đã từng nghe các anh chị, những người lập trình viên kỳ cựu nói: "Code đi, code nữa đi, nghĩ về code mọi lúc đi!". "Code, code, code nhiều hơn nữa!" "Làm dự án cá nhân đi, càng nhiều càng tốt, phải là dự án "chất" vào!" "Giải quyết vấn đề, nghĩ như một trình biên dịch, cày LeetCode, v.v., làm tất cả mọi lúc!" "Cày LeetCode, phỏng vấn thử, làm dự án cá nhân lúc rảnh, tự xây dựng những thứ bạn ước mình có được!"Tại sao mọi thứ cứ phải xoay quanh lập trình thế nhỉ? Một bác sĩ, anh ấy đâu có đi khắp nơi tiêm thuốc hay làm phẫu thuật cho người khác để làm thú vui hay dự án cá nhân đâu (ví dụ này có thể hơi khập khiễng, nhưng bạn cứ tạm chấp nhận nhé!).Hầu hết các lập trình viên coi lập trình là sở thích, là công việc, là cuộc sống, và có khi là cả… người bạn đời nữa chứ! (À không, là niềm vui nữa chứ). Họ chỉ làm một việc duy nhất: code. Dù đang ở bữa tiệc hay trong căn phòng của mình, điều duy nhất họ nghĩ đến là lập trình. "Đầu tư nhiều thời gian hơn, dồn nhiều tâm huyết hơn vào nghề của bạn." Tại sao lại phải như thế chứ?Tại sao cứ phải luôn là về Code? Các kỹ sư cơ khí, điện, hay bất kỳ ngành kỹ thuật nào khác (không phải phần mềm), họ làm việc 8-10 tiếng mỗi ngày, và sau đó họ chẳng nghĩ gì về công việc nữa. Mức độ lo lắng của họ cũng thấp hơn nhiều so với lập trình viên chúng tôi.Hãy nhìn những người lao động chân tay chăm chỉ như công nhân vệ sinh, người làm vườn, thợ mộc… Những công việc này không đòi hỏi quá nhiều kỹ năng và họ cũng chẳng phải "cày cuốc" như dân LeetCode. So với họ, chúng ta, những lập trình viên, lại có xu hướng làm việc nhiều hơn, suy nghĩ nhiều hơn, nhưng lại… làm ít hơn. Tại sao lại thế nhỉ? Chúng ta cũng là con người mà!Tại sao chúng ta phải nghĩ về lập trình mọi lúc, phải học công nghệ mới liên tục và đào sâu kiến thức? Lý do là gì?<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/programmer_brain_overload.png' alt='Lập trình viên luôn suy nghĩ về code'>Tôi xin nhắc lại: Lập trình viên không phải là những con "ngựa thồ"!Hãy nghĩ về một người làm việc ở KFC hay McDonald’s, họ kiếm được ít hơn một lập trình viên trung bình. Nhưng họ lại làm công việc chân tay nhiều hơn chúng ta. Chúng tôi, những lập trình viên, là những nghệ sĩ. Chúng tôi tạo ra nghệ thuật. Chúng tôi sống cùng máy tính, những cỗ máy với các linh kiện tinh vi, và những chiếc bàn phím cơ với âm thanh phím bấm "nghệ thuật". Điều này hoàn toàn khác biệt với một người thợ mộc hay thợ máy dùng dụng cụ của họ, những người làm công việc nặng nhọc hơn nhiều so với chúng ta.Công việc càng tinh xảo, thì yêu cầu về sự sáng tạo và tính nghệ thuật càng cao. Là một lập trình viên, tôi tự coi mình là một nghệ sĩ, miệt mài tạo ra các giải pháp với sự tỉ mỉ và tinh tế, chẳng khác nào một họa sĩ với cây cọ của mình vậy. Đó là lý do tại sao tôi dành cả cuộc đời để "vọc vạch" Arch Linux và Neovim, cấu hình chúng đến từng chi tiết nhỏ.Mỗi lần tôi gõ phím, tôi đều muốn tạo ra những điều tuyệt vời, và mỗi phím bấm đều mang một sự tinh tế đặc biệt, giúp cải thiện năng suất làm việc của tôi trong lập trình.<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/mechanical_keyboard.png' alt='Bàn phím cơ của lập trình viên'>Những suy nghĩ này chợt nảy ra trong đầu tôi khi tôi đang ngồi chán ngán trong lớp và nghe ai đó nói: "Hãy cống hiến cả cuộc đời bạn cho lập trình!". Tôi hỏi lại "Tại sao?", nhưng người đó không có câu trả lời, mà bản thân tôi lúc đó cũng vậy. Nhưng giờ thì tôi đã tìm ra câu trả lời rồi: việc cống hiến cuộc đời cho lập trình đáng giá hơn bạn nghĩ rất nhiều.Bởi vì bạn không phải dành cuộc đời mình để làm những công việc vặt vãnh vô tri. Bạn không dễ dàng bị thay thế. Bạn là một nghệ sĩ đang tạo ra một tác phẩm nghệ thuật. Một tác phẩm nghệ thuật giúp cuộc sống của con người trở nên dễ dàng và năng suất hơn.Tuổi thọ con người có hạn, chúng ta không có vô vàn năm để sống, chúng ta chỉ sống trong một thời gian ngắn. Số lượng những gì chúng ta hoàn thành phụ thuộc hoàn toàn vào mức độ năng suất của chúng ta.Vậy, tóm lại, bạn đang muốn nói gì? Bạn đang muốn nói rằng lập trình viên cần phải cống hiến cuộc đời mình cho lập trình sao? KHÔNG, hoàn toàn không phải ý tôi là vậy. Điều đó đi ngược lại quan điểm của tôi.Vậy ý tôi là gì ư? Nếu bạn đủ nhiệt huyết và nếu lập trình thực sự là "chân ái" của bạn, bạn sẽ có xu hướng vượt qua những vấn đề lớn, và bạn thậm chí có thể tự mình tạo ra mọi thứ. Bạn sẽ tận hưởng niềm vui nhiều hơn bạn nghĩ khi "tái tạo lại bánh xe" (khám phá và tự tay xây dựng những thứ cốt lõi) thay vì chỉ tạo ra một ứng dụng CRUD đơn thuần (những ứng dụng cơ bản chỉ thêm, sửa, xóa dữ liệu).<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/reinvent_wheel_concept.png' alt='Khám phá và tự tay xây dựng những thứ cốt lõi trong lập trình'>Cảm ơn và chúc một ngày tốt lành! - bupd.
Khám phá server-stats.sh, 'con dao Thụy Sĩ' của DevOps giúp bạn nhanh chóng chẩn đoán các vấn đề của máy chủ như CPU cao, bộ nhớ đầy hay ổ đĩa cạn kiệt, biến nỗi sợ 3 giờ sáng thành sự tự tin.
Khám phá sự khác biệt giữa các định dạng gói ứng dụng Linux phổ biến như DEB, RPM, Flatpak, Snap và AppImage. Bài viết giải thích ưu nhược điểm, cách hoạt động của từng loại gói một cách dễ hiểu và hài hước, giúp bạn chọn đúng định dạng cho nhu cầu của mình. Tìm hiểu về sự tiện lợi, tính di động, và cách quản lý ứng dụng trên Linux.
Xin chào các đồng môn lập trình viên của mình! Có phải bạn đang ấp ủ giấc mơ được vọc vạch làm ứng dụng Flutter xịn sò ngay trên 'ông hoàng' Linux của mình không? Nghe thì 'chất' đấy, nhưng cái công đoạn thiết lập môi trường, đặc biệt là phải vật lộn với Java, Android SDK và cả mớ công cụ liên quan, có khi lại khiến bạn chỉ muốn... 'đấm' cái màn hình một phát! Đừng lo lắng nhé, hôm nay mình sẽ mách bạn một tuyệt chiêu siêu đỉnh: Cài đặt Flutter và Android SDK ngon ơ mà KHÔNG HỀ CẦN đến cái Android Studio cồng kềnh kia. Chúng ta sẽ "xài" Neovim để viết code, nhưng bạn cứ tự do chọn VS Code hay bất kỳ trình soạn thảo nào bạn ưng ý nhất nhé! Nào, sẵn sàng biến giấc mơ thành hiện thực chưa? Bắt đầu cuộc phiêu lưu thôi nào! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/linux_flutter_setup.png' alt='Biểu đồ tổng quan setup Flutter trên Linux'> Đầu tiên, để hành trình này suôn sẻ, chúng ta cần triệu hồi một 'trợ thủ đắc lực' mang tên `yay`. Ủa, tại sao lại cần `yay` nhỉ? Đơn giản thôi! Hầu hết những 'nguyên liệu' mà chúng ta cần 'tải về' đều nằm ẩn mình trong kho lưu trữ Arch User Repository (AUR) – một kho tàng khổng lồ của cộng đồng Arch Linux. Và `yay` chính là 'chìa khóa vàng' để mở cánh cửa kho báu này! Mở terminal lên và gõ những 'thần chú' này nhé: `sudo pacman -S --needed git base-devel` `git clone https://aur.archlinux.org/yay.git` `cd yay` `makepkg -si` Tada! Xong bước này là bạn đã có một 'người quản lý gói' đa năng, sẵn sàng chinh phục mọi thử thách rồi đó! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/yay_install_terminal.png' alt='Ảnh chụp màn hình terminal cài đặt yay'> Giờ thì đến màn 'dễ ợt' nhất: Cài Flutter! Chỉ cần một dòng lệnh thần tốc này thôi: `yay -S flutter` Khoan đã, đừng vội mừng! Để Flutter và Android SDK có thể 'tâm sự' và 'hiểu nhau' mà làm việc trôi chảy, máy tính của bạn cần có 'phiên dịch viên' Java (JDK) phiên bản 8 hoặc 10 nhé. Để kiểm tra xem 'phiên dịch viên' Java của bạn đang là ai, hãy gõ lệnh: `java -version` Nếu 'phiên dịch viên' của bạn không phải Java 8 hoặc 10, đừng lo, chúng ta sẽ 'thuê' OpenJDK 8 bằng lệnh: `sudo pacman -S jre8-openjdk` Và đây là bước cực kỳ quan trọng, hãy coi nó như việc bạn 'giới thiệu' cho hệ thống biết 'Java đang ở đâu' và 'đường đi đến Java' là như thế nào. Bạn cần thêm mấy dòng này vào 'sổ tay cấu hình' của shell (là file `.bashrc` nếu dùng Bash hoặc `.zshrc` nếu dùng Zsh): `export JAVA_HOME='/usr/lib/jvm/java-8-openjdk'` `export PATH=$JAVA_HOME/bin:$PATH` Sau khi thêm xong, nhớ 'tải lại' sổ tay bằng lệnh `source ~/.bashrc` (hoặc `source ~/.zshrc`) để những thay đổi này có hiệu lực ngay lập tức nha! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/java_path_setup.png' alt='Ảnh minh họa việc thêm PATH vào .bashrc/.zshrc'> Nghe có vẻ hơi lằng nhằng một chút, nhưng tin mình đi, đây chính là 'chiêu' để tránh xa mấy cái lỗi 'permission denied' (tức là 'bạn không có quyền làm điều này!') đáng ghét sau này đó. Mặc định, `yay` sẽ 'đặt' Flutter vào 'ngôi nhà' `/opt/flutter`. Ngôi nhà này thường chỉ có 'chủ nhà' (người dùng `root` hay 'siêu quản trị viên') mới được phép 'động chạm' thoải mái thôi. Mà chúng ta thì đâu có muốn code với quyền 'siêu quản trị viên' nguy hiểm đó đúng không nào? Vậy nên, chúng ta cần 'cấp phép đặc biệt' cho người dùng của mình để có thể 'tự do' làm việc với Flutter. Chạy các lệnh sau trong terminal: `sudo groupadd flutterusers` `sudo gpasswd -a $USER flutterusers` `sudo chown -R :flutterusers /opt/flutter` `sudo chmod -R g+w /opt/flutter/` Nếu sau đó bạn vẫn thấy 'lỗi quyền' nào đó 'nhảy múa' kỳ lạ, đôi khi chỉ cần một lệnh 'mạnh tay' này là mọi thứ lại 'êm xuôi' (hơi 'bạo lực' một chút nhưng lại hiệu quả bất ngờ): `sudo chown -R $USER /opt/flutter` <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/folder_permission_concept.png' alt='Hình ảnh minh họa khái niệm quyền truy cập thư mục'> Tiếp theo, chúng ta sẽ đi 'sắm sửa' nguyên bộ 'đồ nghề' hoành tráng cho Android SDK. Đây chính là những 'công cụ vàng' thiết yếu để Flutter có thể 'biến' ý tưởng của bạn thành ứng dụng Android chạy bon bon đó! Vẫn là 'anh bạn thân' `yay` lo tất tần tật: `yay -S android-sdk android-sdk-platform-tools android-sdk-build-tools` `yay -S android-platform` Thấy chưa, đơn giản như đang giỡn vậy! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/android_sdk_tools.png' alt='Biểu tượng Android SDK và các công cụ'> Cũng giống như Flutter, 'nhà' của Android SDK cũng 'kén chọn' lắm, nó 'cư trú' ở một nơi cần 'quyền hạn đặc biệt': `/opt/android-sdk`. Vì thế, chúng ta lại phải 'làm thủ tục' tương tự để đảm bảo bạn có thể 'đụng chạm' vào nó mà không bị 'cấm cửa' nhé. Lần này, chúng ta sẽ dùng 'người gác cổng' `setfacl` để 'phân quyền' chi tiết hơn một chút: `sudo groupadd android-sdk` `sudo gpasswd -a $USER android-sdk` `sudo setfacl -R -m g:android-sdk:rwx /opt/android-sdk` `sudo setfacl -d -m g:android-sdk:rwX /opt/android-sdk` <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/lock_and_key_access.png' alt='Hình ảnh chìa khóa mở khóa quyền truy cập'> Bạn có muốn 'test' ứng dụng mà không cần phải lúc nào cũng 'cắm dây' vào điện thoại thật không? 'Người hùng' của bạn chính là Emulator (trình giả lập)! Nó giống như việc bạn có nguyên một 'chiếc điện thoại ảo' chạy 'bon bon' ngay trên máy tính của mình vậy đó. Để xem có những 'phiên bản Android' nào để 'chọn mặt gửi vàng' (mà dân chuyên hay gọi là 'system images'), bạn chỉ cần gõ lệnh này: `sdkmanager --list` Sau khi 'ngắm nghía' xong danh sách, hãy 'chọn' một phiên bản Android bạn ưng ý (ví dụ như Android 29) và tiến hành cài đặt nó. Nhớ là phải 'copy' đúng tên của `system-images` nhé! Ví dụ: `sdkmanager --install "system-images;android-29;default;x86"` Tiếp theo, chúng ta sẽ 'tạo ra' một 'chiếc điện thoại ảo' từ cái 'system image' vừa cài đặt. Hãy thay `<name>` bằng cái tên bạn muốn đặt cho 'dế yêu' ảo của mình (ví dụ: `my_pixel_3`): `avdmanager create avd -n <name> -k "system-images;android-29;default;x86"` Và đừng quên thêm các 'đường dẫn' quan trọng của Android SDK vào 'bản đồ' biến môi trường `PATH` trong file `.bashrc` hoặc `.zshrc` của bạn. Việc này giúp hệ thống của bạn 'tìm thấy' các công cụ này dễ dàng hơn nhiều đó: `export ANDROID_SDK_ROOT='/opt/android-sdk'` `export PATH=$PATH:$ANDROID_SDK_ROOT/platform-tools/` `export PATH=$PATH:$ANDROID_SDK_ROOT/tools/bin/` `export PATH=$PATH:$ANDROID_SDK_ROOT/emulator` `export PATH=$PATH:$ANDROID_SDK_ROOT/tools/` Lại một lần nữa, nhớ 'làm mới' file cấu hình shell bằng lệnh `source` để các thay đổi có hiệu lực ngay và luôn nha! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/android_emulator_running.png' alt='Ảnh chụp màn hình một Android Emulator đang chạy'> Và đây là 'ải cuối' – cũng là 'ải' khiến nhiều người 'ám ảnh' nhất: Chấp nhận các giấy phép (licenses) của Android SDK. Nếu không 'gật đầu' đồng ý, 'ông bác sĩ' `flutter doctor` của chúng ta sẽ cứ 'mè nheo' mãi không thôi đấy! Hãy chạy lệnh này để 'ký tên' chấp nhận tất cả các giấy phép: `flutter doctor --android-licenses` Cứ kiên nhẫn một chút nhé, 'bác sĩ' sẽ hỏi bạn có muốn chấp nhận từng cái không, cứ mạnh dạn gõ `y` rồi Enter thôi! Sau khi mọi thứ 'xong xuôi', bạn có thể 'thăm khám' `flutter doctor` một lần nữa để kiểm tra xem mọi thứ đã 'xanh lè' (tức là ngon lành cành đào) chưa. Nếu không có gì 'lặt vặt' bất trắc, kết quả sẽ 'xanh rờn' như hình dưới đây (trừ phần Android Studio ra nhé, vì chúng ta đâu có cài đặt nó đâu!). <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9rqkhhzi8hzjh5t15iir.png' alt='Kết quả flutter doctor thành công'> **Mẹo nhỏ cứu cánh nếu gặp rắc rối với license:** Nếu sau khi chạy lệnh trên mà 'bác sĩ' `flutter doctor` vẫn 'ca thán' về giấy phép, hãy thử 'đổi chủ' thư mục SDK của bạn về đúng người dùng hiện tại, rồi chạy lại lệnh chấp nhận license: `sudo chown -R $(whoami) $ANDROID_SDK_ROOT` `flutter doctor --android-licenses` Trường hợp 'khó đỡ' hơn (như mình đã từng 'dính chưởng'!), bạn có thể cần phải chạy lại `flutter doctor --android-licenses` thêm vài ba lần nữa đó. Đừng vội nản lòng nhé, 'quả ngọt' đang chờ bạn phía trước! Chúc mừng bạn đã 'phá đảo' thành công! Giờ thì mọi thứ đã 'đâu vào đấy', sẵn sàng để bạn 'nhào nặn' ra ứng dụng Flutter 'đầu tay' rồi đó! Hãy thử tạo một project mới và 'chạy thử' nó xem sao nhé: `flutter create new_app` `cd new_app` `flutter run --debug` Ứng dụng của bạn sẽ tự động 'hiện hình' trên 'chiếc điện thoại ảo' mà bạn đã tạo (nếu nó đang 'sẵn sàng'), hoặc nếu bạn có 'kết nối' điện thoại thật và đã 'kích hoạt' chế độ Gỡ lỗi USB (USB debugging), nó sẽ 'chạy phà phà' trên điện thoại của bạn. Chúc mừng bạn một lần nữa đã hoàn thành xuất sắc nhiệm vụ 'khó nhằn' này! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0hrrw7kjowr71f13malj.png' alt='Ứng dụng Flutter chạy trên trình giả lập'> À, nếu bạn muốn 'trải nghiệm' trên điện thoại thật, nhớ 'kích hoạt' tính năng "Gỡ lỗi USB" (USB debugging) trên điện thoại và 'kết nối' nó với máy tính qua cáp USB nhé. Xong, giờ thì tha hồ 'bay lượn' với Flutter thôi!