theme: cyanosis
我正在参加「豆包MarsCode初体验」征文活动
MarsCode 可以看作一个运行在服务端的远程 VSCode开发环境。 对于我这种想要学习体验某些语言,但不想在电脑里装环境的人来说非常友好。本文就来介绍一下在 MarsCode里,我的体验 rust 开发体验。
一、MarsCode 是什么
它的本质是: 提供 代码助手
和 云端 IDE
服务的 web 网站,可通过下面的链接访问
https://www.marscode.cn/
1. 远程开发 IDE 环境
进入 IDE 面板之后,可以新建一个项目。其中可以左侧选择项目类型,这里选择 rust 项目,命名为 toly_rust。点击创建之后就可以得到一个 Rust 项目。
打开项目后,如下所示,这就相当于一个运行在浏览器中的 VSCode 编辑器。只要有网络,你就可以随处打开它来浏览和编辑。
即使在手机、平板上,也可以在浏览器中查看你的项目信息。你的编程环境并不需要在你的物理设备设备上,并且你的任何设备都可以随时访问。这就是云端编程的魅力:
PS: 虽然手机上编辑文字比较费劲,但作为一至少作为代码阅读器也是极好的。
2. 了解你的云端环境
点击这里可以看到,一个项目相当于你有了一台 2 核 4G 10GB 存储
的远程机器。并且这个机器可以在浏览器,向你展示一个 VsCode 编辑器。 你可以在命令行中操作这台机器。
当你在一个陌生环境中,应该要知道宇宙的终结三问:
第一问: 我是谁
通过 uname -a 在命令行中查看系统的信息。可以看出当前是一个 linux
系统
通过 lscpu 在命令行中查看 cpu 的信息。它的CPU 架构是 x86_64
, 系统核心数 32; 每个核心有 2 个 线程:
通过 cat /etc/os-release 在命令行中查看操作系统版本,可以看出是 Debain 发行版本:
最后通过 free -h 和 df -h 分别查看一下内存和存储情况:
到这里,基本上对当前的操作系统环境有了一个基本的认知。
第二问: 我在何处
通过 pwd 可以看到当前命令行所处的位置:
第三问: 我将去往何方
既然本项目是 toly_rust,那所去往之处自然是 rust 的康庄大道。通过 cargo -V 和 ructc -V 可以查看当前的 rust 版本。这里版本是 1.78.0,还是挺新的:
二、体验 Rust 开发
默认的项目是最熟悉的 Hello World ,点击运行即可在控制台查看结果。下面我们通过两个小案例,来体验一下 Rust 开发:
1.随机字符串程序
功能需求:
封装一个类库,可以
随机
生成指定长度
的字符串。
字符串内容是大字母
、小写字母
、数字
的组合
首先,我想要将该功能封装为一个类库。所以并不想再主程序 main.rs 中书写。可以通过 cargo 来创建一个类库,如下所示:
cargo new --lib str_gen
此时项目结构如下,在主项目的 Catgo.toml
中配置工作环境和模块依赖:
这样我们就可以专注于在类库 strgen 中书写代码。其中 lib.rs
导出 strgen 文件内容:
rust ---->[src_gen/src/lib.rs]---- pub mod str_gen;
也就是说,功能需求代码的书写场地在 str_gen.rs
中。首先来写个函数 range_letter ,可以返回指定 ASCII码表位置 start 的连续 count 个的字符列表。 - rust 中通过 Vec 容纳多个元素, - 遍历 count 次,通过 for i in 0..count - char::from 可以通过 u8 的整型得到 char 型字符 - 在遍历中收集字符即可。
rust fn range_letter(start: u8, count: u8) -> Vec<char> { let mut result: Vec<char> = vec![]; for i in 0..count { let c = char::from(start + i); result.push(c); } result }
接下来需要使用随机数,在类库项目的 Cargo.toml
文件中添加 rand 依赖库。rust 官方的依赖库地址在 crates.io
- 使用 use 关键字引入类库中的内容
- 创建了三个字符列表 num、cap、lower,并将其合并到 pool 中,视为字符资源池
- 遍历 length 次,每次都随机在 pool 中取出一个元素,放入结果字符串中
- rust 中档返回值作为最后一句时,可以省略
return
和;
```rust use rand::Rng;
pub fn randomstring(length: usize) -> String { let num: Vec = range letter('0' as u8, 10); let cap: Vec = range letter('A' as u8, 26); let lower: Vec = range letter('a' as u8, 26); let mut pool = vec![]; pool.extend( num); pool.extend(cap); pool.extend(lower); let mut rng = rand::thread rng(); let mut result = String::new(); for _ in 0..length { let index = rng.genrange(0.. pool.len()); result.push( pool[index]); } result } ```
最后,在主项目中使用 use 关键字导入我们自己写的依赖库内容,然后就可以调用其中的方法:
2.图像生成器
下面进入第二个案例,功能需求是:
- 创建指定行列数的格子,通过输入决定格子的黑白色。
- 将黑白色块以图像的方式输出到指定文件夹,文件名后加时间戳。
该案例中使用了文件、时间、图像生成等功能,是一个非常不错的小案例。其中图像生成的功能使用 image 类库的能力。同样,我们新建一个类库 img_gen
用于处理该功能。效果如下:
在此之前,先处理一些周边的任务,比如文件名称后加时间戳后缀,以及没有文件时递归创建文件。一个函数尽可能做到短小,只做它分内之事。如下所示 namewithtimestamp 为一个字符串的尾部拼接时间戳;ckeckfileor_create 会检查文件是否存在,不存在时自动创建:
```rust use std::fs::File; use std::path::Path; use std::time::SystemTime;
fn namewithtimestamp(input :&str)-> String{ let start = SystemTime::now(); let sincetheepoch = start.durationsince(std::time::UNIXEPOCH) .expect("Time went backwards"); let timestamp = sincetheepoch.assecs(); format!("{}{}", input, timestamp) }
fn ckeckfileorcreate(path: &Path) -> std::io::Result<()> { if!path.exists() { std::fs::createdir_all(path.parent().unwrap())?; } File::create(path)?; Ok(()) } ```
接下来在 gen 方法中,专注处理图片生成的事宜:
- 输入行列数,和黑块的最表列表;
- 遍历行列数,当存黑块列表包含坐标时,将像素置为黑色;否则为白色;
- 计算文件路径,通过 img_buf 将数据写入文件即可:
```rust use image::{Rgb,ImageBuffer};
pub fn gen(row:u32,col:u32,data:Vec<(u32,u32)>) { let max = 255 as u8; let black = Rgb([0, 0, 0]); let white = Rgb([max, max, max]); let mut imgbuf = ImageBuffer::new(row, col); for (y, x, pixel) in imgbuf.enumeratepixelsmut() { if data.contains(&(x,y)) { *pixel = black; }else{ *pixel = white; } } let name = namewithtimestamp("box"); let filepath = format!("{}{}.png","assets/pictures/",&name); let path = Path::new(&filepath); ckeckfileorcreate(path).unwrap(); imgbuf.save(path).unwrap(); } ```
通过两个小案例,简单体验了一下 Rust 语言,还是挺不错的,篇幅有限,就不继续介绍 Rust 了。大家也可以自己写一些小模块来练练手,比如计算 md5,sha256 等。
三、编程助手,问答加成
MarsCode 中集成了 AI,可以辅助编程。
比如在一开始,查看 cargo 版本时有个 wraning,看着很碍眼。说是想要支持旧版本的项目,将 config
改为 config.toml
如果不知道如何在 Linux 中重命名文件夹,就可以咨询一下编程助手:
然后修改一下,就没有 wraning 提示了:
在编程开发中的任何问题,都可以让 AI 助手给你建议。比如如何随机字符串案例中,如何合并多个 Vec ,是它辅助我使用 extend 方法。在学习的过程中,你也可以询问它还有没有别的方式,之间有什么差异和优劣。
以及如何校验和创建文件,也是通过助手来解惑的。
师者,传道授业解惑也
。AI 助手算不上传道授业,但解惑确实不错。可以算是半个老师,而且是一个没有脾气,不知疲倦的老师,会尽可能随时随地帮助你。但 尽信书不如无书
,何道何业,还需我们自己把握。在使用工具辅助的同时要保持主观能动性。
4.配置 ssh key, 提交 git 仓库
MarsCode 是一个云端的编辑器,如果想要在本地访问这些文件,比较麻烦。通过 git 管理项目,将代码仓库维护在 github、gitee 或自己部署的代码仓库,是一个不错的选择。
前面说过,一个项目本质上就是为你分配了一台 Linux 机器,所以可以随意的添加 ssh key 。这里以 gitee 为例,其他也是同理。
- 生成 ssh-key:
ssh-keygen -t ed25519 -C "Gitee SSH Key"
- 得到 ssh-key:
ls ~/.ssh/
- 在设置/安全设置/ssh key 界面添加公钥即可:
- 在命令行测试一下,会展示认证成功:
之后在 gitee 中新建项目,在 MarsCode 控制台将项目提交到远程仓库即可:
到这里 MarsCode 的简单体验就结束了。总的来说,云端编程还是非常 nice 的。如果本地变成的体验感是 100 分,目前远程编辑器感觉可以打 90 分。由于需要依赖网络,网络不佳时,自然体验不佳,这是本质所决定的。
最后我特别喜欢的是在手机或pad上查看代码,让我可以脱离电脑,随时编程。但触屏操作和软键盘的编辑体验确实非常非常差。所以我将其视为一个源码阅读器,和运行器。但目前滑动时,会自动打开软键盘,这个很影响体验。希望非桌面端可以优化一下,或给个开启/关闭的按钮。这样移动端浏览代码体验会很好。那本文就到这里,谢谢观看 ~