即刻App年轻人的同好社区
下载
App内打开
赵KK胡说
217关注28被关注1夸夸
AGI和Web3反复横跳程序员。5次黑客松连续冠军选手。不折腾会死星人。没谱儿AGI开发者。
赵KK胡说
5月前
西安景点,美食和酒店速记

在西安读书没有去过景点,来西安出差也没有去过景点,这次专门带娃来看西安景点和吃西安美食,顺便参加二十年同学聚会,让他们回顾我走过的路。

西安地铁

强烈赞的基础设施。以前读书在南二环长安大学,火车到站总是半夜,黑车很多,的士也很黑,曾经被宰150元,实际正常价11元。现在有地铁真的方便,去哪里都不怕被宰。当然现在很多打车平台也能确保以划算的价格打到车,穷学生的福音。

斯瑞特国际酒店

周五到达后去酒店,住斯瑞特,价钱中等,美团定的比门市价低很多。带娃订了家庭房,套间,两个大床,沙发桌子俱全,都很舒服,还有一个帐篷,有天猫精灵,小朋友喜欢。

虎子水盆羊肉

地铁到酒店后马上寻找吃食,小寨附近有虎子水盆羊肉,马上电话询问是否有座位,有就立即去尝尝。到店之后很多本地人。要了推荐的水盆羊肉,手抓羊排,辣炒羊肚。作为我来说味道一流,不和我一起吃肉的婴齐也吃了很多肉。烧饼点多了,和水盆羊肉一起很好吃,高估了我们吃面食的能力。

果渊斋

泡馍没有去吃靳老师推荐的老黄,婴齐要去吃网红果渊斋,在洒金桥!幸好没踩雷,味道我认为在线,很多本地人。但是作为一个二十年只吃过个位数次数泡馍的人,我的意见不足参考😄。馍还是要多了,冰峰很赞,糖蒜很赞,我的泡馍吃完了,婴齐的剩下一半。老记得以前都是放辣椒酱,现在都是油泼辣子了吗?掐细细,泡开后,用筷子从边上扒拉着呼噜,瞬间冒汗。旁边有个本地大哥,掐的每一粒是我的三分之一,份量是我的两倍,没要饮料高汤,吃完了!厉害!例汤有汤和茶,味道都很赞。

老君巷见罐罐茶

这是桌子找的地方,他是西安扛把子,读书时睡我上铺。茶还不错,地方也不错,如果不想逛了想坐坐是不错的选择,离城墙钟楼都近,共享单车即可到达。邱邱,伟达,福田,桌子都在喝茶了,然后我来了。二十年未见也好像是昨天,不知道我们还有几个二十年!所以能相见且相见,别等不能相见空怀念!二十年了,恩怨情仇不过一杯茶。

唐人里陕菜

还是桌子提议的。大包间,地道陕菜。九个大人七个小孩,非常热闹。菜是什么味道完全不在意。第一次见到桌子夫人小孩,又见到小凤,第一次见到小凤的先生。这世界上的好人总是能凑到一块!大家的日子都很好,我也很好,真好!

城墙

如果去对时候,城墙真棒!我认为第一次去西安的人都应该去城墙体验一下,如果天热,从永宁门上去走一小段,钟楼博物馆下进博物馆也是很好的。城墙是明代重建,大国气象,厚重端实。有成人票和学生票,可以一天多次进入,如果买了票没有上,自动退票。天热注意防暑,城墙上的温度由于反射,比地面高5度以上,眩晕中暑都是家常便饭。有自行车租赁,没有带棚子的,怕风。天热的时候自行车座能把屁股烫熟。城墙总长13公里,量力而行。

碑林博物馆

书法和金石爱好者圣地。有景云钟,多宝塔碑,玄秘塔碑,颜勤礼碑等等等等,数不胜数。南区是一些常见的碑文,不能说不珍贵,比起多宝塔碑这样的档次稍微逊了一些。一定要听讲解,可以不请导游,电子讲解30块,或者自己进去手机扫码听讲解。标有数字的碑都有解说,没标的不懂的人就看个热闹好了,字的美是能感觉出来的。北区是新开的展馆,玄秘塔碑,多宝塔碑等珍品都在里面,历史书上的物件总算看到真颜。看到唐代夫妇的石棺,突然想不知道当年的算命先生怎么算的?今人死掉立即挫骨扬灰,不会有更差的结局了😄

陕西自然博物馆

想了解三秦大地风貌由来值得去,适合小朋友。

秦始皇陵博物院

来西安如果不去钟楼不去城墙不去碑林不去兵马俑,我认为相当于没来过。商业化当然无处不在,但是去每一个地方,都应该去感受当地最地道的历史。如果仅仅凭好评差评决定一个地方是否值得去,那么我们不应该去任何地方。08年我曾经去过兵马俑,黑车去的,回来要抢中巴。这次行程就简单多了,叫车过去,45公里才97块,商务车。我问师傅利润,师傅说不开经济他没有单,他本来是跑专车的。坐地收佣果然是最划算的生意。中国人做闪购,卖菜,快递,网约车,美国人做AI,AR,VR,具身智能,大家都有美好的未来。

这里一定要请导游,十年前黑导游会骗你,现在他们不敢。门口遇到挂有导游证的都可以,一家大小四人160元,讲解水平见仁见智,看运气,如果是一家人单独一个导游比较好,非常自由。一号坑二号坑三号坑都是值得去的,土堆丽山园只有铜车马值得看,也是历史书上的物件。地宫只是XR表演,值不值得见仁见智,想看实景的就不要去了,想感受历史的值得,小朋友值得。

一般导游出门会带你去茯茶的店,二十年茶精喝下来觉得口感绵柔,带了两盒。可以不带。茶这东西要适合自己喝,别人说的天花乱坠都不如自己喝一杯。景区出来吃的都不太行,好在不宰人,填肚子就随便,想吃地道的口味还是去西安吧😄。有卖刀剑的,未开锋,不能上火车,可以快递。真棒!

华清宫

没上山,门口婴齐拍照打卡,然后地铁闪人。兵马俑到华清宫坐613,每个人5块。的士也是5块,我们坐的公交,没坐的士,靠谱程度自己判断。公交则肯定靠谱,一站到达华清宫门口。看完下山就是地铁站,直接回西安。

大雁塔,长安十二时辰,大唐不夜城

网红打卡拍照街,不赘述。满坑满谷,人山人海。

回民街

大家都说不值得去,但是还是那句话,如果你第一次来西安,想体验西安的民俗,可以去一下。人山人海是肯定的,商业化是肯定的,但是作为地标存在也是毋庸置疑的。以前还要防范小偷,现在好多了,大家都不带现金。当然手机也要防止被偷,但是几率几乎可以忽略不计。
01
赵KK胡说
5月前
不支持OOP的Rust怎么实现面向对象?

面向对象的程序由对象组成。一个对象包含数据和操作这些数据的过程。这些过程通常被称为方法 或操作。

封装(encapsulation):一个对象的实现细节对使用该对象的代码不可见。

继承(Inheritance)是一种机制:一个对象可以从另一个对象的定义中继承元素,从而获得父对象的数据和行为。Rust原生不支持继承,但是Rust可以使用宏实现集成。

多态(polymorphism):如果多个对象共享某些特征,可以在运行时将它们互相替代。

bounded parametric polymorphism:Rust 使用泛型来抽象不同可能的类型,并通过 trait bound 来约束这些类型所必须提供的内容。

鸭子类型(duck typing):如果它走起来像一只鸭子,叫起来像一只鸭子,那么它就是一只鸭子!

单态化处理:编译器为每一个被泛型类型参数代替的具体类型生成了函数和方法的非泛型实现。单态化产生的代码在执行静态分发(static dispatch),也就是说编译器在编译时就知晓要调用什么方法。

动态分发 (dynamic dispatch):编译器会生成负责在运行时确定该调用什么方法的代码。

trait bound在编译时单态化,trait对象只能动态分发。

模式由如下一些内容组合而成:

字面值

已解构的数组、枚举、结构体或者元组

变量

通配符

占位符

match和if let可以互换使用,区别在于if let并不要求穷尽,编译器也不会警告未处理的分支。

C的赋值就是赋值,Rust的赋值是模式匹配。现代编程语言大多是模式匹配赋值。

模式有两种形式:refutable(可反驳的)和 irrefutable(不可反驳的)。

能匹配任何传递的可能值的模式被称为是不可反驳的(irrefutable)。一个例子就是 let x = 5; 语句中的 x,因为 x 可以匹配任何值所以不可能会失败。

对某些可能的值进行匹配会失败的模式被称为是可反驳的(refutable)。一个这样的例子便是 if let Some(x) = a_value 表达式中的 Some(x);如果变量 a_value 中的值是 None 而不是 Some,那么 Some(x) 模式不能匹配。

refutable用于赋值、参数传递、for循环,irrefutable用于条件表达式。1.65以后可以用 let Some(x) = some_option_value else { return; }; 写法。

at 运算符(@)允许我们在创建一个存放值的变量的同时测试其值是否匹配模式。

match msg {

Message::Hello { id: u8 @ 3..=7 } => todo!(),

...

}

范围约束在Rust match常用,在其他语言不常用。标准C的switch case不可能case一个范围,golang的可以是范围但需要用条件表达式写法。Gcc给C扩展了范围写法,但不是标准,不能跨平台兼容。

Unsafe就是告诉编译器“相信我,这段代码是安全的”。

不安全的超能力(unsafe superpowers)(除了下述5种能力,在不安全的代码块中,Rust仍然进行其他安全检查,例如引用)

引用裸指针(裸指针就是C里面的指针,一个指向任意内存地址或者为空的值)

调用不安全的函数或方法(FFI)

访问或修改可变静态变量

实现不安全 trait

访问 union 的字段

可以同时创建同一地址的可变和不可变裸指针,但不能同时创建可变和不可变引用。

调用unsafe的结果返回值是safe的。

全局可变静态变量的修改总是不安全的,如果一定要修改,需要unsafe,或者使用线程安全的智能指针。

trait可以是unsafe的,如果我们定义的类型包含某些未实现 Send Sync 的类型,例如裸指针,但又想将该类型标记为 Send Sync,就必须使用 unsafe。

如果要在新模块中为其他模块类型实现trait,可以使用newtype模式绕过孤儿规则。

闭包不能作为fn返回,但是可以作为Fn trait返回。
00
赵KK胡说
5月前
Rust的第一个难点:并发和异步

底层语言抽象设备,期望高性能;高层语言抽象需求和解决方案。

Rust标准库使用1:1现成模型,golang标准库使用M:N现成模型。

如果将变量借用给新线程,Rust会自动推导借用的有效周期,如果编译器发现借用可能会在新线程有效期内失效,编译器会报错,进而防止运行时错误内存访问。例如,启动新线程后立即drop借用变量。C和CPP编译器不会针对共享变量报错,需要通过UT甚至系统测试才能发现运行时错误。

move到新线程的借用由于所有权转移,主线程不能再使用该变量。

不要通过共享内存来通讯;而要通过通讯来共享内存。

锁的释放在离开作用域时自动发生。

为什么不是所有基本类型都是原子性的?线程安全会造成性能损失,我们希望只在必要时才为此买单。

Arc的引用计数时线程安全的,Rc不是,因此Rc不能用于多线程环境。

任何完全由 Send 的类型组成的类型也会自动被标记为 Send,Sync也一样。

并发:通过时间片切换在互斥资源处理多个独立任务,使其看起来像是同时在处理。

并行:多个不同资源同时处理多个独立任务。

Rust中的async总是在处理并发。并发也可能在底层使用了并行。

异步运行时管理异步代码的状态机数据结构。main是程序入口点,编译器没有为main管理运行状态机,因此main不能是async的。main可以设置多个tokio等运行时管理内部异步代码状态。

对于大部分功能,嗲用着不应在future返回Ready后再次调用poll。很多future在完成后再次poll会panic。

Future的await将被编译为poll代码。

通过 await 直接 await 一个 future 会隐式地 pin 住这个函数。

Rust 为异步代码块创建的 future 可能最终会在任意给定变体的字段中包含对其自身的引用(内部引用)。

鉴于额外性能开销较大,Rust编译器并未在对象倍移动时更新所有引用。Rust使用Pin确保引用相关的数据结构不会在内存中移动,无需更新任何引用。在安全代码中,禁止移动任何有自身活动引用的项。

指针依然可以随意移动,Pin确保指针指向的数据保持不动,就不会错用内存。C和CPP中需要程序员显式调用free和delete,java和golang使用运行时gc,Rust由编译器确保。

大多数类型没有Pin也可以安全移动,只有当项中含有内部引用时才需要Pin。

编译器自动为所有被证明为安全的类型实现 Unpin。

Pin和Unpin需要阅读英文原版。Pin很好理解,防止出现C里面的野指针。例如realloc一个buffer,原来的buffer将会被free,如果在realloc之后继续使用其他buffer,可能会破坏内存。

即使数据结构没有内部引用,如果被Pin住,也只能通过Pin的API进行移动操作。但是如果该结构实现了Unpin,那么即使被Pin住,也是可以自由移动的。Rust编译器为可以证明安全的类型实现了Unpin。

!Unpin用于特别声明编译器必须维护内存数据不被移动的安全保证。

线程作为同步操作集的边界;线程之间的并发是可能的。任务作为异步操作集的边界,任务之间和之内的并发是可能的,因为任务可以在其内部切换 future。最后,future Rust 中最细粒度的并发单位,同时每一个 future 可能代表一棵由其它 future 组成的树。其运行时 -- 更具体地说,其执行器(executor)-- 管理任务,任务则管理 future。

进程,线程,协程,纤程,任务,future,傻傻分不清楚。

线程有点像 “射后不理”(“fire and forget”);它们没有原生等同于 future 的机制,所以它们简单地运行到结束而不会被中断,除非操作系统本身介入。也就是说,它们没有像 future 那样内建任务内并发(intratask concurrency)支持。-- 这翻译多少有点脏!

原生线程通常都是一个任务,没有退出点,实现者自己使用signal或者flag标志退出。协程或者任务由任务管理器管理任务切换,在特定的yield点通过jmp buf强制跳转到下一个任务执行。因此如果某个任务一直在处理耗时的任务不退出,那么当前任务也是要被卡死的。

很多运行时采用一种被称为工作窃取(work stealing)的方式来透明地在线程间移动任务,它基于当前线程是如何被利用的,以提高系统的整体性能。

当思考何时采用哪种方法时,考虑这些经验法则:

如果工作是非常可并行的,例如处理大量数据其中每一部分数据都可以单独处理时,线程是更佳的选择。

如果工作是非常并发的,例如处理大量不同来源的消息,它们可能有着不同的间隔或者速率,异步是更佳的选择。

简单粗暴的理解就是计算密集用线程,IO密集用异步。
00
赵KK胡说
5月前
为了让编程助手更好支持Rust,以及准备RustChinaConf presentation,重新系统学习Rust

C++和Rust的泛型都会在编译的时候单态化。
单态化的缺点:
- 编译时间
- 代码膨胀

trait是组合的方式,Rust没有继承,都是组合。

只有在 trait 或类型至少有一个属于当前 crate 时,我们才能对类型实现该 trait。-- 孤儿规则 orphan rule 相干性 cohere

trait中的方法可以有默认实现,特定类型可以重载该实现

trait中的默认实现可以调用trait中的其他方法,哪怕这些方法没有默认实现
可以用trait约束参数类型,只要满足实现了trait的类型都可以作为合法参数
where从句和trait bound的意义是一样的

返回trait的函数也只能返回单一类型,不能根据不同情况返回多个实现trait的不同类型

move让闭包获取它在环境中所使用的值的所有权

因为 enum 实际上只会使用其中的一个变体,所以 Message 值所需的空间等于储存其最大变体的空间大小。

关于智能指针(智能指针就是堆上的带引用计数和生命周期管理的内存地址)
当所涉及到的类型定义了 Deref trait,Rust 会分析这些类型并使用任意多次 Deref::deref 调用以获得匹配参数的类型。这些解析都发生在编译时,所以利用 Deref 强制转换并没有运行时开销!

- T: Deref<Target=U> 时从 &T &U。
- T: DerefMut<Target=U> 时从 &mut T &mut U。
- T: Deref<Target=U> 时从 &mut T &U。

Deref隐式转换不能将不可变引用转成可变引用。

Rust 并不允许我们主动调用 Drop trait drop 方法;当我们希望在作用域结束之前就强制释放变量的话,我们应该使用的是由标准库提供的 std::mem::drop 函数。

Rust是通过编译器配合一系列引用操作确保内存不会错误使用,在C中引用就是赋值,编译器不会禁止多次引用赋值。Rust中引用赋值之后所有权改变,再次赋值编译器将会报错。只有从头定义calling convention才有可能做到,C和C++是不可能中途改变calling convention,因此是不可能这么安全地去实现的。

要么只有一个可变引用,或者无数个不可变引用,不可同时拥有可变引用和不可变引用。

Box是编译期不可变引用,RefCell是运行时不可变引用。

如果 Rust 接受不正确的程序,那么用户也就不会相信 Rust 所做的保证了。然而,如果 Rust 拒绝正确的程序,虽然会给程序员带来不便,但不会带来灾难。
RefCell<T> 正是用于当你确信代码遵守借用规则,而编译器不能理解和确定的时候。

选择 Box<T>,Rc<T> RefCell<T> 的理由:
Rc<T> 允许相同数据有多个所有者;Box<T> RefCell<T> 则只有单一所有者。

Box<T> 允许在编译时执行不可变或可变借用检查;Rc<T> 仅允许在编译时执行不可变借用检查;RefCell<T> 允许在运行时执行不可变或可变借用检查。

因为 RefCell<T> 允许在运行时执行可变借用检查,所以我们可以在即便 RefCell<T> 自身是不可变的情况下修改其内部的值。

RefCell让外部不可变的变量可以在实现内部修改其内部值。内部可变引用同样遵循只能有一个可变引用规则,和Box不同,RefCell的多个可变引用是运行时报错。

Rc和RefCell不能用于多线程代码。

Rc和RefCell结合可以让内部可变引用拥有多个所有者(危险技能)。

Rust 并不保证完全防止内存泄漏,这意味着内存泄漏在 Rust 中被认为是内存安全的。

一种内存泄漏的例子:Rc和RefCell的循环引用。

实现需要引用父节点的列表,应该使用Weak而不是Rc,这样子节点引用而不是拥有父节点,不会形成循环引用。
00
赵KK胡说
5月前
各位Web3薅羊毛的老铁们,我正在做一个让没有代码能力的人参加黑客松的vscode vibe coding插件,你们有兴趣吗?

事情起源于我最近重度vibe coding的过程,深刻感受通用编程助手对垂直领域支持非常有限。例如对于我们深度参与的Linera这个项目,通用编程助手对于微链概念无能为力。你很难指望一个不能理解微链的编程助手写出符合微链规范的应用,因此我想既然我们会在微链上开发很多应用,何不先做一个编程助手来帮助我们自己,顺带帮助那些想参加黑客松的项目早期支持者。

如果你对这个插件有兴趣,或者有想要我们支持的功能,欢迎加我私信或者评论讨论。我们已经在Linera黑客松获得2W美金奖励,当然都靠手敲代码,希望将来我们的插件能帮助大家开辟一条新的渠道😄
00
赵KK胡说
6月前
实战vibe coding两天之后,我觉得应该怎么vibe coding

Vibe coding中文一般翻译成氛围编程,但是我觉得不贴切,翻译成嘴撸编程更好。

Vibe coding的最大好处是让没有经历过编程训练的人也可以尝试自己动手做一些需要的工具。那么还需要专业工程师吗?我认为还是需要的,向编程助手说清楚想要做什么也是很重要的能力。产品经理当然也可以描述清楚,但是实战下来很多时候还是需要更加准确的技术语言,编程助手会理解的更加准确。

最早使用的gemini cli,创建API key之后开始使用。很多人说gemini cli是最好的编程助手,因为使用学生邮箱申请免费账号6月30日结束,我晚了一天没有申请到,因此只简单用免费请求试验,生成的网页质量不行,但是我认为是我没有调教到位。

丐版创业团队钱都要省着花,其他编程助手没有测试,据说cursor,claude都很不错。简单试用了aider,可以自己对接第三方API,是不错的框架,缺点是没有vscode插件,自己写当然不是现在的当务之急。

现在在用的是codebuddy,使用的这段时间免费,不限token,可以中文输入,可以上下文,可以大工程,生成的网页审美一般,但是一步步调教还是能够生成符合要求的网页。代码架构什么的不必说了,AI生成的代码架构就是没有架构。对于Bug的定位偶尔需要人介入,例如不能很好处理复杂html的标签闭合判断,有时候让它自己运行单元测试、修正错误直到没有错误并不能正确执行,需要手动运行单元测试将错误贴给它,但是写单元测试已经很在行了。偶尔卡死,这个时候重新开一个新的聊天会话能解决很多问题。不过免费加不限token和可以经过嘴撸生成令人满意的前端代码已经值回测试票价。后端代码还没有开始,后面我们会将我的第一个嘴撸项目发布上线给大家试用。

整体来说编程助手会令强者越强,随着编程助手能力越来越强,算力越来越便宜,以后嘴撸代码会是主流。
00
赵KK胡说
6月前
想了解一下有多少人现在还有提笔写字的欲望?
30
赵KK胡说
6月前
尽管的确认识到幸运与不幸,但整日纠缠于此未免太过任性。
00
赵KK胡说
6月前
我们从宽敞明亮的大办公室搬到了20平的4人工位小黑屋

我们周末搬家了,从有宽敞明亮的会议室的大办公室搬到了众创空间的4人工位。写这篇文章的时候网络还未通,手机码字。手机码字不如机械键盘键入流畅,思路也断断续续,那么写到哪算哪。

我是20年入住湾谷,那时疫情刚结束,正好Filecoin挖矿兴起,我因此停掉了已经有雏形的RCV,开始挖FIL。今天来看,很难准确评价这个选择的对错,一个缺乏运营思维的工程师是不可能做好一个ToC的应用的,即使继续RCV,可能也不过是惨淡收场。在湾谷的经历并不算美好,谈不上成功失败,过程错误连连,无非是在很多环节上偷懒导致覆灭而已。

我们最早是研发Filecoin挖矿,早前挖矿还有市场,我们虽然不算先发,但是我确信我们拥有首屈一指的研发能力,因此我们用短的多时间构建起完整的可靠挖矿集群,最多的时候我们管理了几百P的算力。这个量级的存储以前不敢想象,一间中等规模的创业公司,数据大概也不会超过100T。尽管都是垃圾数据,我们也终于对大数据存储体系有了初步认知。

Filecoin高开低走,江河日下,市场上诈骗案件连发,我们因此萌发其他业务思路,第一个是面向日本市场提供云算力平台解决方案。一个云算力平台解决方案是简单的,但那时我并不想做得那么简单,因为有BTC算力这一更大的市场,我希望做一个通用平台,将来在其他市场售卖BTC算力。为什么是BTC算力?因为那时候我认为我们有可以边挖边卖的BTC算力资源。纯粹的算力平台是一个伪命题,算力是一个囤资产的业务,想依靠平台买入卖出赚取利润异想天开。我并未进行竞调,并不能确定这些算力事实上是否存在。这是我们第一次失败的尝试,我们虽然构建了完整的平台,但是平台的目标商品不存在。没开始就错了。

尽管我们最终并没有能够售卖一开始预想的商品,我们还是构建了一个强大的平台,所以思维的惯性,让我想依靠这个平台继续开发业务。我们开始研究质押,试图通过质押来获取稳定现金收入。然而,本质上我不是币圈的人,我此前也没有做过市场和行销相关工作,我们也没有市场和行销能力,我找不到能够构成可以支撑节点运营的质押底池所需要的币,再次没开始就放弃了!

我们再次尝试是在TAO上面,从上面赚取现金流。Chutes子网我进去的时候只有4个矿工,所以我们赚到了第一波,尽管不多。但是挖矿就是这样,如果没有闲置资产,想依靠租赁云主机获取利润,市场会让利润急剧下降,最终只有自持资产的人才能获利。这是市场规律,在有钱赚的地方,人永远会被迫聪明。我们大约在挖了两个月TAO之后,每日成本就不能覆盖了,所以我们退出。

再后来,我们在没谱上面验证了大量的AI模型,尝试在AI上做一些应用。挖矿这件事已经结束了,做到极致的人自然能够赚钱,但是也需要投入巨大的精力和人力,技术能力在这里不再是最重要的因素了。

但AI应用刚刚开始,或许我们能从4人工位重新开始,找到自己的路吧。

另外:

我最近会开抖音直播账号讲书。我自己喜欢看书,看很多书。我从未玩过抖音,我希望通过玩抖音了解社会的最新形态,请大家捧场。

再另外:

我们在产品侧除了没谱儿,也在尝试AI工具类产品,如果有人有兴趣了解和沟通,欢迎关注、评论、私信联系。

再另外:

如果大家觉得我的经历有参考价值、写作风格有意思、人还行或者一无是处,请大家关注我!
00
赵KK胡说
6月前
书要越读越薄才行啊!
00