Hi there 👋

Welcome to x1a0y4o’s blog

  • Interested in Machine Learning and DevOps. Currently working on a master’s degree.

  • Mostly use Python. Want to learn Julia, Rust and much more. Fimiliar with docker / linux.

  • Economics / Philosophy are my hobbies other than Technologies.

March 5th Again

今天我问曹和婕,用什么方法可以联系你。其实我知道,如果只是找到你,说几句话,没有什么难的,但是说什么呢,我要用什么样的方式才能让你看到我的心呢。 我想了很久,不记得是哪天看到一句话,“你忘不掉的究竟是那个人,还是那样喜欢的自己”,这个问题对我来说真的太简单,因为我一直那样喜欢你,从未改变。爱一个人的程度如果有量化方式,会是念念不忘的时长,还是午夜梦回的次数,或者是刻骨铭心的痛楚?我不知道该如何回答这个问题,答案对我来说也无关紧要,我想要的只是再次握起你的手。 半年来,也在自己的内心写过无数句,关于想念,关于梦境,关于伤悲,关于愧疚的话语。我知道我从未后悔,走过这一程,但是我还是会期望,期望像我那次留下的呓语,让我们再爱一次。 今年的冬天格外的冷,生日那天,我一个人坐在电脑前,回看最珍贵的记忆。零点时分,听到生日快乐我的宝贝,泪流满脸。我不知道该怎么表达,因为我不想让你感受痛苦或者什么,情绪太过浓烈,而这调色盘里我只想送你玫粉或鹅黄。原谅我的胡言乱语,怪我不是梵高(我不喜欢达芬奇)也不是李白(但是他写的爱不咋地),就当是我把每一场梦都写给你看。 我坚信我们还会相遇,这种宿命般的信念出现在我这坚定的无神论者身上真是荒谬,但是它就是如此。所以无论还有多远,还有多久,我都会走到你身边,无论到那时我们如何,我都希望看到一个自由又美丽的你。那么如果可以,就让我们再爱一次 不论是853天731天还是180天,小付,我很想你

March 5, 2024 · 1 min · 6 words · x1a0y4o

Rust学习日记0x03

模块和包 Crate Crate是Rust编译的最小代码单位,即使是使用rustc而非Cargo,也会将那个文件认作是一个crate。 Crate的两种形式:二进制项和库,前者提供main函数定义被执行时的操作,后者没有main函数,也不会被编译为可执行文件。 Package 包提供一个或多个crate,通过cargo.toml文件描述如何构建crates,至多含有一个library crate,至少含有一个crate Cargo创建包之后,会将src/main.rs当作与包同名的二进制crate根文件,如果存在src/lib.rs会当作是与包同名的库crate根文件,多个二进制crate可以放在src/bin目录下。 crate 根文件将由 Cargo 传递给 rustc 来实际构建库或者二进制项目。 模块作用域 Crate根文件作为Crate的编译入口,可以在其中使用mod modename关键字声明模块,编译器会依次从: 内联 “src/modname.rs” “src/modname/mod.rs” 中寻找模块代码。 同理也可以声明子模块,使用mod submodname,编译器会依次从: 内联 “src/modname/submodname.rs” “src/modname/submodname/mod.rs” 中寻找子模块代码。 use关键字,可以通过指向代码路径,创建该方法的快捷方式, Paths 在Rust中,指向模块的路径使用::分隔 绝对路径:以Crate根开头的路径,对于模块内代码使用crate字面量 相对路径:从当前模块开始,使用self、super或当前模块标识符开头 私有性 在使用模块时,需要注意模块的私有性,在Rust中,子模块的所有项目都是私有的,需要使用pub关键字暴露其路径使其变为公有。 即使模块是公有的,其内部内容仍然是私有的,需要显式声明pub 结构体 即使结构体是公有的,其字段仍然可以是私有的。且当结构体具有私有字段时,需要设计关联函数。否则无法在其他的模块中创建该结构体,因为无法设置私有字段的值。 枚举 与结构体不同,如果枚举是公有的,其枚举成员都是公有的。 Use关键字 使用use关键字,可以在其所在作用域里创建一个指向路径的快捷方式,使其成为在当前作用域的合法名称。 通常在使用use关键字时,约定俗成的习惯是 创建函数的父模块路径 结构体、枚举完整路径 其他完整路径 pub use重导入 利用pub use不仅可以将路径导入到当前作用域,还可以允许他人将路径导入到其作用域中。 外部包 导入外部包时,需要使用use将其引入项目包的作用域,即使是标准库对于项目包来说也是外部包,因此使用时需要导入,如下: use std::collections::HashMap; 嵌套路径 为了避免多次使用use语句,可以使用嵌套路径进行表达,形如: use std::{cmp::Ordering, io}; use std::io::{self, Write}; 也可以使用glob运算符,例如*一次性导入某路径下所有公有项。

March 28, 2023 · 1 min · 62 words · x1a0y4o

Rust学习日记0x02

自定义数据类型 本文中概念在Rust高手ChatGPT指导下学习 Struct 结构体 定义结构体 没有什么花里胡哨的,使用struct关键字加上结构体名称就好,字段名可以不指定(元组结构体,用括号代替大括号),字段类型必须指定(单元结构体除外,不需要括号) ⚠️注意,结构体实例化时是等效赋值语句的,所以如果使用结构体更新语法,从现有结构体实例中更新一个新的结构体,如果字段是类似String这样在堆上的数据类型,更新会等效所有权中的移动,也就是原实例失效,再使用时会报E0382部分所有权移动错误。(吐槽:Rust高手没有指出这个问题,并且在给出示例的时候信誓旦旦这样不会有问题…但是丢到rust-analyze里一下子就被指出来问题惹) 如果是更新具有copy trait的类型,而非获取所有权不影响原结构体实例。 可以通过将字段类型改为引用的方式,避免更新结构体时所有权移动的问题,但是需要定义生命周期,后续进一步学习。 结构体方法和关联函数 方法这个概念在Python这些强OOP的语言当中应该是一个比较常见的概念,这里不赘述了。除了定义在impl块内,定义方法和定义普通函数并无不同,但是方法的第一个参数为self(self:Self的简写,Self类型是impl块的类型的别名),这里self和其他变量并无不同,可以是&self也就是实例的自身引用。 和C++不同,Rust在处理对象的方法与对象引用的方法时,并无差别,因为Rust会自动解引用。 impl块中定义的函数,都被称之为关联函数,只是其中以self为第一个参数的会被称为方法。不是方法的关联函数经常被用作返回一个结构体新实例的构造函数。结构体名和 :: 语法来调用这个关联函数。 Enums 枚举 定义 使用enum关键字定义自定义类型和成员,例如: enum IpAddrKind { V4, V6, } 枚举值,通过let定义,而枚举成员位于其标识符的命名空间中,因此采用::表示。 关联类型 可以通过将数据类型放入枚举成员,而不是将枚举作为结构体的一部分,此时枚举成员的名字也变成了一个构建枚举的实例的函数。 enum IpAddr { V4(u8, u8, u8, u8), V6(String), } let home = IpAddr::V4(127,0,0,1); let loopback = IpAddr::V6(String::from("::1")); 关联方法 与结构体相似,枚举也是使用impl来定义关联方法,不再赘述 Option 枚举 作为标准库定义的枚举,针对一个值要么有要么没有值的场景。没错,Rust中没有空值null的实现。但是没有null值并不代表没有空的概念,因此Rust通过枚举类型来解决这个问题。Option的定义如下: enum Option<T> { None, Some(T), } 难道这里的None不就是null换了个名字吗?不是的,因为Option<T>和 T(这里 T 可以是任何类型)是不同的类型,编译器不允许像一个肯定有效的值那样使用 Option<T>,会报E0277错误 ...

March 21, 2023 · 1 min · 151 words · x1a0y4o

Rust学习日记0x01

在寒假期间简单对Rust的数据类型和语法有了一个粗浅的了解之后,卡在了Ownership这个不同于其他编程语言的内存管理概念上。由于很少有实践,学习Rust就暂时搁置了下来,而在GPT-4和Cursor推出以后,再次燃起了一些兴趣。本文便是用于记录在AI助教的帮助下学习Rust语言的过程。 入门扫盲——基础编程概念 在有其他语言的基础上,理解起来不会太费劲的概念。但是也需要注意不同语言之间的区别。 变量:一个默认不会变的量,因此它如果会变,请定义时加上mut。 不可变变量是不可以二次赋值的,但是可以重新let x定义,此时第一个值会被隐藏。通常这一点可以应用在不同作用域。 同时,与使用mut相比,重新赋值还可以改变变量的数据类型(因为本质上是定义了一个同名的新变量)。 与不可变变量相比,常量更加不可变,并且在定义时需要显式定义数据类型。 数据类型:分为两个子类scalar标量和compound复合类型 整型:与大部分静态语言相同。不过出现整形溢出时,debug模式编译器会报Panic而release模式会默认补码操作,但是这种wrapping的行为不太好 浮点型:f32与f64(default),分别是单精度与双精度 布尔型:true和false 字符型:char,4字节的unicode标量值,用单引号包围;与之相对的双引号用来包围字符串字面量 元组:tuple,一个非常熟悉的概念,元组的长度是固定的 数组:array,同样熟悉的概念,但是在Rust中,数组成员类型必须相同并且长度也是固定的。 Vector:尽管Vector并非原生复合类型,但是作为标准库提供的一种可以改变长度的类似数组的复合类型,还是在这里提一下,后续应该会深入学习 函数: 定义:使用关键字fn定义,函数定义的顺序无所谓,只要调用时处于调用处可见的作用域中即可 参数:parameters是函数签名的一部分,调用时用来传入arguments。在Rust中,定义参数时必须提供类型注解。 语句和表达式:前者执行操作但不返回值,后者计算并返回值。Rust是一门基于表达式的语言。函数调用是一个表达式。宏调用是一个表达式。用大括号创建的一个新的块作用域也是一个表达式 函数返回值:不需要对返回值命名,但是需要提供类型注解。并且隐式返回最后的表达式 控制流: if表达式:没什么太多好说的,唯一需要注意的可能是Rust中if表达式的条件必须是bool类型的值,与动态语言会自动转换不同。另外,如果想要在赋值语句中应用if表达式,需要保证不同分支结果的变量类型一致。 循环结构:loop和while以及for,都是常见的循环结构,不过Rust中可以定义循环标签,方便break和continue控制循环层。 Ownership所有权 一个与我此前学过的语言迥异的概念,解释起来其实并不复杂,但是很难适应。 Ownership的意义:一种内存管理机制,为了更好的追踪和分配堆上的内存。 Ownership的规则 Rust中的每一个值都有一个所有者 值在任一时刻有且只有一个所有者 当所有者(变量)离开作用域,这个值将被丢弃 变量的作用域scope:从声明直到作用域结束 通过String理解所有权 String是第二个字符串类型,用于未知大小的字符串。 2023-03-19 果然到Ownership就会半途而废是吗( 移动 是否可以理解成,当Rust处理堆上内存时,为了避免二次释放,所以浅拷贝不存在了,而是所有权的转移。或者说是发生浅拷贝之后,原变量不再拥有所有权了。 而深拷贝(Clone),永远不会自动创建。 拷贝 Copy是一个trait,不同于Clone,因为处理的对象是栈上的内存,所以并不会带来太多性能损耗。但是不允许自身或任何部分实现了Drop trait的类型使用。Drop是自动在变量离开作用域时调用的函数,用于释放内存。 引用与借用 reference可以理解成永远指向有效值的指针。使用&表示。 创建引用的行为称之为借用,借用但是并不拥有值的所有权。所以当引用停止时并不需要通过返回值交还所有权。 如果需要修改引用对象的值,需要创建一个可变引用。关于可变引用有一些规则,为了避免数据竞态(果然Rust的设计没有写过很多C是体会不出来的),这里简单罗列一下: 不能同时创建两个可变引用 可以创建多个不可变引用 创建可变引用后,不可以再使用不可变引用 另外,Rust通过生命周期解决了垂悬引用的问题。我们日后再深究 Slice Pythonista多么熟悉的概念 设计slice是为了解决索引与对象本身不关联的问题(令人大开眼界) Slice的语法是..,索引从0开始,可以省略开头和结尾(再次熟悉) 字符串的字面值就是Slice let s = "Hello, world!"; 此处s的类型居然是&str,是一个指向二进制程序特定位置的不可变引用 2023-03-20:为了保证学习可持续,本系列打算高频更新以督促进度,所以可能学到一部分知识点就发一次,虽然零碎但是起码能保证一点一点学习,可能后面会考虑再整理吧

March 19, 2023 · 1 min · 62 words · x1a0y4o

1st Anniversary

写在一周年之际 亲爱的小付,不知不觉我们竟已共同走过一个冬夏。这短短一年里,留给我的回忆却是如此丰富而绚丽,以至于现在提笔想跟你写点什么的时候,无从选择。这一年里,我们从相知相识,到亲密无间,却又因为毕业而不得不成为异地的恋情,其间种种无不浓墨重彩。那么,把365天当作一个里程碑,且让我小小的得意而快乐吧! 如果要让我写点什么来形容你,那么就像我在聊天中说的,任何限定都不足以描述你,于我而言,你便是美好的化身,是幸福的具象。翻看去年生日给你写下的祝福,里面提到过无数爱你的理由,而现在,这些美丽的闪耀的记忆碎片,更是堆成了一座小山,在我的记忆宫殿里熠熠生辉。6月,在汉阳的快乐小屋里,我们度过的那些时光,足以让我永远怀念。8月,黄山的旅途中,最让我印象深刻的不是黄山的秀美风光,而是酒店门口你捧着玫瑰的笑容。以及此后的,无数聊天记录里的,妙言妙语,就像一粒粒珍珠,散布在独属于我们的时光里。作为一个坚定的无神论者,我仍是忍不住感谢命运,让我遇见你,从此踏上了这一路幸福的旅程。 那天晚上你发给我一套小学女生般的题目,我其实很想很想认真的,给你一封长长的答案,但是怕写太久了你等不及,便只能匆匆作答。此刻,且让我为你细细道来。 “没遇见你之前的理想型”,我的回答是“有趣的人”,其实我不确定在遇见你之前,我是否真的有一个所谓的理想型,直到你出现。有趣,不仅是幽默是搞笑,更是有对生活的热情,有着永远不会枯竭的创造力。曾经我在自己的19岁生日寄语里,对自己的如此说道:宁可无用,不可无趣。于是小宝就出现在了我的生命中,在遇到你之前,我以为作为一个武汉土著,我已经算是比较了解这座城市。然后你带着我走街串巷,尝遍宝藏美食,坐看东湖日落,在我最熟悉的城市,你成为了我的导游。如果说是对生活的热爱还不足形容,小宝送给我的礼物,更是让我惊喜连连。从来没有感受过如此真挚而用心的爱意,盲盒的创意让我至今难忘。而祝福的视频,还有一次次的vlog,是你那蓬勃创造力最好的注脚。 “理想的结婚年龄”,真的,我现在就想。从毕业以后,我就时常考虑这个问题,前些日子,甚至还和老谢聊到过这个话题,你说你和朋友讲想和我结婚被骂作恋爱脑。我又何尝不是呢?那么再认真再理性的思考,都无法阻止我回答,现在就想同你迈入婚姻殿堂。 “对方最害怕的东西”,这个问题,其实也是很难回答,想来你不是真正的小学女生,所以我的回答是失去。其实,这也是我最害怕的东西,我是一个充满惰性的人,我害怕失去,失去如今拥有的,就是我最怕的。“对方的底线是什么”,放心我对自己的约束一定高于你的底线。 “以后想要定居的城市”,和你在一起就好,不管是江苏镇江,还是湖北武汉,抑或是异国他乡,只要有你在我身边,吾心安处是吾家,你就是我的心安处。“将来希望有几个孩子”,其实这个问题我还蛮纠结的,因为我认为回答不属于我而是你,如果你对生育抱有恐惧,那么丁克我也可以。 “独处的时候会干什么”,想你啊,很难不去想,独处的时候做什么都是想你,看书也好,假寐也罢,处处是你的踪影。“更喜欢热闹还是安静”,这个问题啊得分情况其实,你在的时候,热闹变成了人间烟火,安静便是处处清欢,你不在的时候,热闹也令我烦躁,安静也让我寂寥。“什么瞬间突然想娶”,笑,很多时候,真的。 “觉得生活的仪式感重要吗”,其实以往的我,虽然也在意,但是往往也不会如何。但是和你在一起的时候,所有仪式都成为了值得留恋的宝藏,每一次都会被认真对待的人,自然也会开始注重仪式感。“第一次拥抱和接吻的感觉”,拥抱的时候,其实我们还没有在一起,但是我得寸进尺的拥抱,小宝也自然的回以我,于是我就再也不想从怀中离开,是香软,是依赖,是流连。至于第一次的接吻,是缠绵悱恻,是甜蜜幸福。 “吵架时什么话会让你伤心”,每句话,虽然我深知以后生活中发生争吵是不可避免的,但是我还是希望,能克制自己的情绪,能把重点放在争论本身,而非攻击和伤害。“对异地恋和冷暴力对看法”,正在经历异地恋的我们,有什么看法呢?当然是痛恨。但是就像你说过的那句,距离之于爱情就如风之于火,吹熄那些微弱的助长那些热烈的。我们的爱情,永远不要因为距离而熄灭。 时值我们的一周年到来之际,我想说宝辛苦了,但是也怀揣着无尽的勇气,愿和你一同迎向未来。希望我们的感情,能永远真挚而不褪色,我爱你。

March 5, 2023 · 1 min · 12 words · x1a0y4o

First Post in CSU

The first blog written in CSU,also the first one written by vim editor. 来到中南约莫有一个月了,回顾了一下自己的生活,其实还是有很多值得记录下来 生活 说实话感觉长沙与武汉还是有很多相似的地方,不管是气候还是饮食。但是铁道附近的餐饮实在是令人一言难尽,都说长沙是美食城市,偏偏在铁道附近形成了一块黑洞。学校周边的湘菜净是些油腻重口的菜,不是辣椒炒肉便是辣椒炒辣椒。每道菜的做法看起来简直是一模一样,肉切的小小的碎碎的,虽然下饭,但不能多吃。 长沙的天气,和武汉真的很像,但是可能没有大江大河,所以相比起来有些干燥。太阳也毒辣许多,刚来一个星期皮肤就黑了一个度,赶紧打起伞来。 学业 实验室的氛围出乎意料的放松,原本毕业设计时期对老谢PUSH狂魔的印象也发生了翻天覆地的变化。师兄们都非常温和而亲切,逾严师兄甚至直接把分配给他的PC让给了我,大师兄在第一次组会就让我觉得是一大好人,让我想起了花姐。果然,后来PHM课题组的第一次聚餐,酒桌上最后的赢家大师兄送走了所有师弟,和我一起慢慢悠悠晃回宿舍,讲了很多课题组的故事。其他的同门也非常友善。长沙,jin好。 但是老谢布置的课题真的很难,-idea已打码-,总之就是很难实现,头秃。 剩下的还有好多好多,但是今天已经11月2号了,再拖下去这篇处女blog就永远也发不出来了。后续应该会更多更新一些技术方面的Blog,下次见~

September 20, 2022 · 1 min · 21 words · x1a0y4o

ToDarlingFu

To Darling Fu: 亲爱的付老师,很开心能陪伴你一起度过这个特别的生日,大学生活里的最后一个生日。脑子里实在是有太多太多的想法,我们在一起的画面仿佛幻灯片一样在我脑中不断闪掠。时间真的过的好快,去年我的生日仍在我记忆里闪闪发光时,就已经迎来了宝贝的23岁生日。那么,首先祝宝贝生日快乐~ 我这几天一直在说,付敏璇是一个大家都爱的女孩子,有这么多人记得你的生日,愿意为你送上祝福,我真的替你开心。是啊,这是多么值得开心的事情,我喜欢的人值得被这么多朋友呵护与关爱。在这封想到哪写到哪的信里,实在有太多话想跟你说,哪怕语无伦次我都要告诉你,我为喜欢这么棒的一个女孩而由衷自豪。记得宝贝很喜欢追问我,到底喜欢你哪一点。抛开每次我的回答里那些,漂亮、可爱、善良、豁达不谈,此时此刻我想带你一起回忆一些记忆里的时刻,一些会让我为自己记忆力感到庆幸的时刻。在那辆回南湖的出租车上,我头晕躺在你大腿上时,你为我轻轻揉太阳穴,为我挡住车窗外照进的灯光时,我说,那就是我爱你的理由;在网易云里和你一起听,明明知道你已经进入甜美梦乡,但是我仍不愿摘下耳机暂停音乐,于是在第二天的凌晨5点,我醒来,耳机里播放着“只在今夜,想你一万遍”,在那个瞬间,我想了你一万又一万遍;在Token合照那天,一向不愿在公众场合亲吻的宝贝,主动亲我的那个时候,就是我爱你的理由;在KTV里,你埋在我脖颈间休息的时候,眼睫毛一下又一下拨动我动脉的时候,就是我爱你的理由;在圣诞节和我一起拼玫瑰积木的时候,你看着花,我看着你,在那个美丽瞬间,我愿为你送上无数朵玫瑰;在无数我们相伴的时刻,都有我爱你的理由。在我们两个大学生涯最后一个生日期间,发生了最美丽的故事,这既是你送给我的,也是我为你准备的,最好礼物。

June 7, 2022 · 1 min · 5 words · x1a0y4o