thảo luận Nhật kí tự học lập trình Rust - phát triển ứng dụng Desktop (Both CLI + GUI)

  • Người tạo chủ đề Người tạo chủ đề duykhanh471
  • Ngày bắt đầu Ngày bắt đầu
rút năm nay ngỏm r thì phải. Đến youtuber cũng bỏ bê r
Học ngôn ngữ sao học theo trend vậy bác:)) mình còn học cả Lisp để luyện tư duy lập trình (Theo sách HtDP với khóa SICP đều bắt dùng Lisp Scheme). Rust đáp ứng đủ nhu cầu của mình nên nó thực sự ổn mà. Nếu học kiểu bác thì có khi năm nay tôi đã học Zig, Julia hay cái khác rồi. Bản thân Rust khó học với không nhiều việc ở trong nước nên tùy, ít nhất mình học vì nhu cầu cá nhân chứ không liên quan đến công việc nên không vấn đề.
 
Mình chuyển kho Repo của mình sang Codeberg nên các Repo ở các bài đăng trên sẽ không vào được nữa. Đồng thời mình có viết thêm một ứng dụng Desktop đầu tiên bằng egui: Flowmo (https://codeberg.org/duykhanh471/Flowmo)

(Code này mình bê từ bên Github và chỉnh sửa lại để dùng theo ý mình, mình chưa dám nhận là đủ giỏi để bắt đầu viết một dự án từ đầu mà không biết gì quá nhiều)

Dự án này thực sự có rất nhiều cái mà mình đã học được từ nó.
 
Tôi xử lý lỗi trên Rust, thực ra là hơi ngu vì vẫn dùng expect() khá nhiều nhưng parse từ Url sang có quá nhiều vấn đề có khả năng xảy ra ;-;

Ruby:
pub fn process_filename(name: &str) -> String {
    let tmp_url = url::Url::parse(name)
        .map_err(|_| "").expect("Không thể chuyển đổi từ URL được")
        .path_segments()
        .ok_or("").expect("Không chuyển đổi được sang Path Segment")
        .last()
        .ok_or("Không thể lấy tên tệp từ URL")
        .map(String::from).expect("Không chuyển đổi được sang định dạng String");
    let filename_ext = Path::new(tmp_url.as_str()).extension().unwrap().to_str();
    match filename_ext {
        Some(ext) => String::from(ext),
        None => {
            println!("Không thể xử lý tên tập tin ảnh, tên tệp sẽ được đặt theo tên ảnh gốc lấy từ trang tải về");
            tmp_url
        }
    }
}
 
Cập nhật 08/07:

Dậy từ 4h sáng ngồi cày tiếp và hoàn thành được TƯƠNG ĐỐI CLI Downloader cho Blogtruyen, TruyenQQ: blt-dl (https://codeberg.org/duykhanh471/blt-dl) (Mình đang tìm thêm các trang truyện để thêm vào)

Mình đang tìm thêm những ý tưởng mới để học thêm về tự động làm nhiều thứ trên PC (Bulk Rename, Batch Downloader .etc.)

Những điều mới mình học được:
  • Xử lý tên, chuỗi, Url, Path.
  • Xử lý lỗi thông qua Option và Result nhiều hơn (Vẫn còn nhiều expect(), thay vì unwrap() vì gọn hơn). Dùng Option linh động hơn Result vì dù ở cả None hay Some đều yêu cầu trả về giá trị. Còn Result thì khi gặp Err thì mình mới chỉ dừng lại ở việc trả Err về Terminal và chưa có cách nào để xử lý tốt hơn và tránh ứng dụng bị ngừng hoạt động ngay lập tức (Ví dụ ứng dụng trên, nó sẽ bị dừng ngay lập tức nếu mất mạng, mình mới tìm được cách xử lý thông qua sử dụng Header trong reqwest nhưng chưa thử áp dụng)
  • Web Scraper: Xử lý Header, Cookie, User-Agent (Còn headless-browser nữa :< muốn tìm cách thay thế để tải đống dữ liệu trên một số trang khá nặng JS)
  • Xử lý đa luồng: Lần đầu nghịch async fn, tokio trên Rust, lần đầu thêm khó khiếp mà thêm thành công tốc độ nhanh hơn hẳn. Gần như mọi hàm cần lấy dữ liệu từ internet hay xử lý hình ảnh mình đều thêm async/await

Còn rất nhiều thứ khác nữa

Dự tính tiếp theo:
  • Hoàn thiện phần mềm quản lý kiến thức viết bằng Rust + gtk4-rs (Dự định ra bản cho Linux DEADLINE - 31/07/2024)
  • Viết Backend cho Web bằng Rocket: Chưa có định hướng quá rõ ràng nhưng đang viết Frontend, rồi sẽ đưa lên Backend hoặc thậm chí lên Tauri để đưa hệ sinh thái TS/JS đi muôn nơi :>
 
Sửa lần cuối:
Mình chuyển kho Repo của mình sang Codeberg nên các Repo ở các bài đăng trên sẽ không vào được nữa. Đồng thời mình có viết thêm một ứng dụng Desktop đầu tiên bằng egui: Flowmo (https://codeberg.org/duykhanh471/Flowmo)

(Code này mình bê từ bên Github và chỉnh sửa lại để dùng theo ý mình, mình chưa dám nhận là đủ giỏi để bắt đầu viết một dự án từ đầu mà không biết gì quá nhiều)

Dự án này thực sự có rất nhiều cái mà mình đã học được từ nó.
Codeberg này có ưu điểm gì mà bác move sang thế nhỉ :D
 
Cập nhật ngày 13/07/2024:
Làm thêm phần mềm ngu ngu nhái BadPeggy do không tải được trên mạng nữa, trang của Dev sập rồi, mà may còn Source Code trên Github nên vẫn tham khảo mà bê nó qua Rust được, sẽ làm GUI bằng gtk4-rs sau vì đang học nên chắc còn khướt lắm mới được tương tự như Bad Peggy, nhưng để lọc ảnh thì cũng ổn rồi: GitHub - onlyduyy/badpeggy-rs: GUI tool, scanning for damaged image files. Inspired by BadPeggy, written in Rust (https://github.com/onlyduyy/badpeggy-rs)
 
Rust thấy bảo code tuy cực nhưng output ra xịn sò, performance tốt hơn so với các ngôn ngữ khác đúng không chủ thớt?
 
Rust thấy bảo code tuy cực nhưng output ra xịn sò, performance tốt hơn so với các ngôn ngữ khác đúng không chủ thớt?
Mình không hiểu ý bác ở đây Output là gì nhưng Performance thì tùy từng task bác làm á, nhưng về đa phần là nhanh hơn thiệt :>
 
Bị compiler chửi mình lập trình ngu sao mà nó đau

Mã:
warning: called `iter().cloned().collect()` on a slice to create a `Vec`. Calling `to_vec()` is both faster and more readable
  --> src/main.rs:20:24
   |
20 |     let id = &args[2..].iter().cloned().collect::<Vec<_>>().join("");
   |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `.to_vec()`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_cloned_collect
   = note: `#[warn(clippy::iter_cloned_collect)]` on by default
 
Thay đổi cách đọc đầu ra, Rust từ xe đạp thành ma tốc độ
Ruby:
fn main() -> anyhow::Result<()>{
    let args = Cli::parse();
    let file = File::open(&args.path).with_context(||
        format!("Couldn't read the file {:?}:", &args.path))?;
    let content = BufReader::new(file);
    println!("Searching pattern \"{}\" inside {:?}", args.pattern, args.path);

    let stdout = io::stdout();
    let mut handler = io::BufWriter::new(stdout);
    writeln!(handler, "kaishi: {}", &args.pattern)?;

    for line in content.lines() {
        let line = line?;
        writeln!(handler, "searchin' in the current line: {}", &line)?;
        if line.contains(&args.pattern) {
            writeln!(handler, "{}", line)?;
        }
    }
    Ok(())
}

  • Đọc trong sách CLI thì read_to_string() sẽ ghi toàn bộ nội dung đọc từ tệp vào bộ nhớ nên chậm, có gợi ý sử dụng PathBuf
  • println! tự động flush mỗi lần chạy, nên nó sẽ chậm nếu có lượng output lớn (Trước có ông nói về việc này nhưng hôm nay đọc mới ngộ ra)
 
Cuối tháng 7 sẽ thiết kế lại ứng dụng euroka (Vì hàng gốc lằng nhằng quá) và thêm ktimetracker nữa, vì thích quản lý thời gian trên Terminal hơn
 
Đang làm python dev, cũng tính học Rust theo idol Armin Ronacher, dạo này thấy job blockchain cho SOL cũng tuyển dữ
 
Xưa tính học cái này mà thấy ngữ pháp lằng nhằng quá nên học golang, vừa viết được app ghẻ đầu tiên từ mấy tuần trước.
Golang thấy trên mạng bảo học dễ lắm mà mất bao nhiêu thời gian tui mới nhập môn được :shame:
 
Xưa tính học cái này mà thấy ngữ pháp lằng nhằng quá nên học golang, vừa viết được app ghẻ đầu tiên từ mấy tuần trước.
Golang thấy trên mạng bảo học dễ lắm mà mất bao nhiêu thời gian tui mới nhập môn được :shame:
Chúng nó lừa đấy, trần đời mà dễ học chỉ có js, thế nên js mới lắm tai họa.
 
Xưa tính học cái này mà thấy ngữ pháp lằng nhằng quá nên học golang, vừa viết được app ghẻ đầu tiên từ mấy tuần trước.
Golang thấy trên mạng bảo học dễ lắm mà mất bao nhiêu thời gian tui mới nhập môn được :shame:
Rust với Golang
Con nào ngon hơn nhể các bác?
 

Thống kê chủ đề

Ngày tạo
duykhanh471,
Người trả lời cuối
emlameo4`,
Trả lời
142
Lượt xem
27.186
Quay lại
Lên đầu trang