「豆包Marscode体验官」 | 云端 IDE 启动 Rust 体验

news2024/9/21 0:34:03

theme: cyanosis

我正在参加「豆包MarsCode初体验」征文活动

MarsCode 可以看作一个运行在服务端的远程 VSCode开发环境。 对于我这种想要学习体验某些语言,但不想在电脑里装环境的人来说非常友好。本文就来介绍一下在 MarsCode里,我的体验 rust 开发体验。


一、MarsCode 是什么

它的本质是: 提供 代码助手云端 IDE 服务的 web 网站,可通过下面的链接访问

https://www.marscode.cn/


1. 远程开发 IDE 环境

进入 IDE 面板之后,可以新建一个项目。其中可以左侧选择项目类型,这里选择 rust 项目,命名为 toly_rust。点击创建之后就可以得到一个 Rust 项目。

image.png

打开项目后,如下所示,这就相当于一个运行在浏览器中的 VSCode 编辑器。只要有网络,你就可以随处打开它来浏览和编辑。

image.png

即使在手机、平板上,也可以在浏览器中查看你的项目信息。你的编程环境并不需要在你的物理设备设备上,并且你的任何设备都可以随时访问。这就是云端编程的魅力:
PS: 虽然手机上编辑文字比较费劲,但作为一至少作为代码阅读器也是极好的。

99e13b45288b584b8bf45a03c70be1b.jpg


2. 了解你的云端环境

点击这里可以看到,一个项目相当于你有了一台 2 核 4G 10GB 存储 的远程机器。并且这个机器可以在浏览器,向你展示一个 VsCode 编辑器。 你可以在命令行中操作这台机器。

image.png

当你在一个陌生环境中,应该要知道宇宙的终结三问:

第一问: 我是谁

通过 uname -a 在命令行中查看系统的信息。可以看出当前是一个 linux 系统

image.png

通过 lscpu 在命令行中查看 cpu 的信息。它的CPU 架构是 x86_64, 系统核心数 32; 每个核心有 2 个 线程:

image.png


通过 cat /etc/os-release 在命令行中查看操作系统版本,可以看出是 Debain 发行版本:

image.png

最后通过 free -hdf -h 分别查看一下内存和存储情况:

image.png

到这里,基本上对当前的操作系统环境有了一个基本的认知。


第二问: 我在何处

通过 pwd 可以看到当前命令行所处的位置:

image.png


第三问: 我将去往何方

既然本项目是 toly_rust,那所去往之处自然是 rust 的康庄大道。通过 cargo -Vructc -V 可以查看当前的 rust 版本。这里版本是 1.78.0,还是挺新的:

image.png


二、体验 Rust 开发

默认的项目是最熟悉的 Hello World ,点击运行即可在控制台查看结果。下面我们通过两个小案例,来体验一下 Rust 开发:

image.png


1.随机字符串程序

功能需求:

封装一个类库,可以随机生成指定长度的字符串。
字符串内容是 大字母小写字母数字的组合

image.png


首先,我想要将该功能封装为一个类库。所以并不想再主程序 main.rs 中书写。可以通过 cargo 来创建一个类库,如下所示:

cargo new --lib str_gen

此时项目结构如下,在主项目的 Catgo.toml 中配置工作环境和模块依赖:

image.png

这样我们就可以专注于在类库 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

image.png

  • 使用 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 关键字导入我们自己写的依赖库内容,然后就可以调用其中的方法:

image.png


2.图像生成器

下面进入第二个案例,功能需求是:

  • 创建指定行列数的格子,通过输入决定格子的黑白色。
  • 将黑白色块以图像的方式输出到指定文件夹,文件名后加时间戳。

该案例中使用了文件、时间、图像生成等功能,是一个非常不错的小案例。其中图像生成的功能使用 image 类库的能力。同样,我们新建一个类库 img_gen 用于处理该功能。效果如下:

image.png


在此之前,先处理一些周边的任务,比如文件名称后加时间戳后缀,以及没有文件时递归创建文件。一个函数尽可能做到短小,只做它分内之事。如下所示 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,可以辅助编程。

image.png

比如在一开始,查看 cargo 版本时有个 wraning,看着很碍眼。说是想要支持旧版本的项目,将 config 改为 config.toml

image.png

如果不知道如何在 Linux 中重命名文件夹,就可以咨询一下编程助手:

image.png

然后修改一下,就没有 wraning 提示了:

image.png


在编程开发中的任何问题,都可以让 AI 助手给你建议。比如如何随机字符串案例中,如何合并多个 Vec ,是它辅助我使用 extend 方法。在学习的过程中,你也可以询问它还有没有别的方式,之间有什么差异和优劣。

image.png


以及如何校验和创建文件,也是通过助手来解惑的。

image.png

师者,传道授业解惑也。AI 助手算不上传道授业,但解惑确实不错。可以算是半个老师,而且是一个没有脾气,不知疲倦的老师,会尽可能随时随地帮助你。但 尽信书不如无书 ,何道何业,还需我们自己把握。在使用工具辅助的同时要保持主观能动性。


4.配置 ssh key, 提交 git 仓库

MarsCode 是一个云端的编辑器,如果想要在本地访问这些文件,比较麻烦。通过 git 管理项目,将代码仓库维护在 github、gitee 或自己部署的代码仓库,是一个不错的选择。
前面说过,一个项目本质上就是为你分配了一台 Linux 机器,所以可以随意的添加 ssh key 。这里以 gitee 为例,其他也是同理。

  • 生成 ssh-key:

ssh-keygen -t ed25519 -C "Gitee SSH Key"

image.png

  • 得到 ssh-key:

ls ~/.ssh/

image.png

image.png

  • 在设置/安全设置/ssh key 界面添加公钥即可:

image.png

  • 在命令行测试一下,会展示认证成功:

image.png

之后在 gitee 中新建项目,在 MarsCode 控制台将项目提交到远程仓库即可:

image.png


到这里 MarsCode 的简单体验就结束了。总的来说,云端编程还是非常 nice 的。如果本地变成的体验感是 100 分,目前远程编辑器感觉可以打 90 分。由于需要依赖网络,网络不佳时,自然体验不佳,这是本质所决定的。

最后我特别喜欢的是在手机或pad上查看代码,让我可以脱离电脑,随时编程。但触屏操作和软键盘的编辑体验确实非常非常差。所以我将其视为一个源码阅读器,和运行器。但目前滑动时,会自动打开软键盘,这个很影响体验。希望非桌面端可以优化一下,或给个开启/关闭的按钮。这样移动端浏览代码体验会很好。那本文就到这里,谢谢观看 ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1935916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Games101学习笔记 Lecture22 Animation(cont.)

Lecture22 Animation(cont. 一、单个粒子模拟Ordinary Differential Equation ODE 常微分方程ODE求解方法——欧拉方法解决不稳定中点法改进欧拉方法自适应步长隐式欧拉方法 二、流体模拟基于位置的方法物质点方法 一、单个粒子模拟 想模拟粒子在场中的运动 Ordinary Differe…

Token Labeling(NeurIPS 2021, ByteDance)论文解读

paper&#xff1a;All Tokens Matter: Token Labeling for Training Better Vision Transformers official implementation&#xff1a;https://github.com/zihangJiang/TokenLabeling 出发点 ViTs的局限性&#xff1a;尽管ViTs在捕捉长距离依赖方面表现出色&#xff0c; 但…

代码随想录算法训练营第五十八天|108.冗余连接、109.冗余连接II

108.冗余连接 题目链接&#xff1a;108.冗余连接 文档讲解&#xff1a;代码随想录 状态&#xff1a;还行 思路&#xff1a; 并查集可以解决什么问题&#xff1a;两个节点是否在一个集合&#xff0c;也可以将两个节点添加到一个集合中。 题解&#xff1a; public class Main {p…

套用BI方案做数据可视化是种什么体验?

在数字化转型的浪潮中&#xff0c;数据可视化作为连接数据与决策的桥梁&#xff0c;其重要性日益凸显。近期&#xff0c;我有幸体验了奥威BI方案进行数据可视化的全过程&#xff0c;这不仅是一次技术上的探索&#xff0c;更是一次对高效、智能数据分析的深刻感受。 初识奥威&a…

.net dataexcel 脚本公式 函数源码

示例如: ScriptExec(""sum(1, 2, 3, 4)"") 结果等于10 using Feng.Excel.Builder; using Feng.Excel.Collections; using Feng.Excel.Interfaces; using Feng.Script.CBEexpress; using Feng.Script.Method; using System; using System.Collections.Gen…

场景分析法挖掘需求的常见4大步骤

场景分析方法&#xff0c;有助于精确定位需求&#xff0c;优化产品设计&#xff0c;促进团队协同&#xff0c;减少项目风险&#xff0c;提升用户满意度与市场竞争力。若场景分析不足&#xff0c;产品可能偏离用户需求&#xff0c;导致功能冗余或缺失&#xff0c;用户体验差&…

java中传引用问题

在 Java 中&#xff0c;所有对象都是通过引用传递的&#xff0c;而基本数据类型是通过值传递的。 引用传递&#xff1a; 当一个对象作为参数传递给方法时&#xff0c;传递的是对象的引用。对这个对象引用进行的修改会影响到原始对象。例如&#xff1a; public class Test {p…

Designing Data-Intensive Applications数据密集型应用系统设计-读书笔记

目录 第一部分可靠性、可扩展性、可维护性硬件故障描述负载 吞吐与延迟可维护性 第二章 数据模型与查询语言第三章索引哈希索引B-tree事务 第三章 编码第二部分、分布式数据系统第五章 数据复制单主从复制节点失效日志实现复制滞后问题 多主节点复制 第六章、数据分区3 第一部分…

10个常见的电缆载流表,值得收藏!

众所周知,电线电缆的载流是所有电工、电气人员都必须具备的基本储备,但是如果要将那么多的“数字”都记得清清楚楚,还是有一点困难的!今天咱们就做了一个电力电缆载流量对照表,速度收藏!下次参考不迷路! 1、0.6/1KV聚氯乙烯绝缘电力电缆载流量 以上电缆载流量计算条件:…

世界启动Ⅳ--利用AI和费曼技巧学习一切

前言 有无数的学习技巧可以帮助你消化复杂的概念&#xff0c;并有信心记住它们。如果你像我一样是一个不断学习的学生&#xff0c;你就会明白有效学习方法的重要性。其中最简单的一种就是费曼技巧。 在本文中&#xff0c;我将解释如何有效地应用费曼学习方法&#xff0c;以及…

应用最优化方法及MATLAB实现——第5章代码实现

一、概述 继上一章代码后&#xff0c;这篇主要是针对于第5章代码的实现。部分代码有更改&#xff0c;会在下面说明&#xff0c;程序运行结果跟书中不完全一样&#xff0c;因为部分参数&#xff0c;书中并没有给出其在运行时设置的值&#xff0c;所以我根据我自己的调试进行了设…

迁移学习在乳腺浸润性导管癌病理图像分类中的应用

1. 引言 乳腺癌主要有两种类型:原位癌:原位癌是非常早期的癌症&#xff0c;开始在乳管中扩散&#xff0c;但没有扩散到乳房组织的其他部分。这也称为导管原位癌(DCIS)。浸润性乳腺癌:浸润性乳腺癌已经扩散(侵入)到周围的乳腺组织。侵袭性癌症比原位癌更难治愈。将乳汁输送到乳…

C++中的new和模版

前言 随着C的学习&#xff0c;讲了C的发展过程、流插入、流提取、函数缺省值、类与构造等等。接下来学习C很方便的 玩意&#xff0c;函数模版。函数模版就像是模具一样&#xff0c;C会自动用模版编译出合适的函数供程序员使用。以前不同类型相同操作的函数都能通过函数模版&…

【iOS】——内存对齐

内存对齐是什么 内存对齐指的是数据在内存中的布局方式&#xff0c;它确保每个数据类型的起始地址能够满足该类型对齐的要求。这是因为现代处理器在访问内存时&#xff0c;如果数据的起始地址能够对齐到一定的边界&#xff0c;那么访问速度会更快。这种对齐通常是基于数据类型…

客户中心应急管理的作用和特征

近些年作为事故、灾难等风险的预防主体和第一响应者&#xff0c;客户中心的应急管理取得了较大进展&#xff0c;但总体上仍存在很多薄弱环节&#xff0c;如安全事故频发&#xff0c;自然灾害、公共卫生、社会安全事件等给运营机构带来了多方面的不利影响。从信息角度看&#xf…

20240720 每日AI必读资讯

OpenAI 推出GPT-4o mini取代 GPT 3.5&#xff01; - 性能超越 GPT 4&#xff0c;而且更快更便宜 - 该模型在MMLU上得分为82%&#xff0c;在LMSYS排行榜上的聊天偏好测试中表现优于GPT-4。 - GPT-4o mini的定价为每百万输入标记15美分和每百万输出标记60美分&#xff0c;比之…

【golang-ent】go-zero框架 整合 ent orm框架 | 解决left join未关联报错的问题

一、场景 1、子表&#xff1a;cp_member_point_history cp_member_point_history表中字段&#xff1a;cp_point_reward_id 是cp_point_reward的主键id 当本表中的cp_point_reward_id字段为0&#xff08;即&#xff1a;没有可关联主表的&#xff09; CREATE TABLE cp_member_poi…

项目开发之文件上传 (秒传、断点续传、分片上传)(看这一篇就懂了)

目录&#xff1a; 前言秒传什么是秒传核心逻辑代码实现 小文件上传什么是小文件上传核心逻辑代码实现 分片上传什么是分片上传核心逻辑代码实现 断点续传什么是断点续传核心代码实现 前言 文件上传在项目开发中再常见不过了&#xff0c;大多项目都会涉及到图片、音频、视频、文…

npm安装依赖包报错,npm ERR! code ENOTFOUND

一、报错现象&#xff1a; npm WARN registry Unexpected warning for https://registry.npmjs.org/: Miscellaneous Warning ETIMEDOUT: request to https://registry.npmjs.org/vue failed, reason: connect ETIMEDOUT 104.16.23.35:443 npm WARN registry Using stale data…

Python | Leetcode Python题解之第235题二叉搜索树的最近公共祖先

题目&#xff1a; 题解&#xff1a; class Solution:def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:ancestor rootwhile True:if p.val < ancestor.val and q.val < ancestor.val:ancestor ancestor.leftelif p.val >…