2024年2月

第三章:分层架构

传统的
IT
团队结构按照技术领域进行组织,例如演示团队、后端开发团队和数据库团队等。由于大多数架构师、设计师和开发人员对这种结构非常熟悉,分层架构成为大多数商业应用程序开发项目的自然选择。然而,就像所有架构风格一样,它具有优点和缺点,并不适用于所有系统。

描述

在分层架构风格中,组件被组织成水平层,每个层在应用程序中扮演特定角色,例如展示逻辑、业务逻辑和持久化逻辑。尽管层数可能有所不同,但大多数分层架构由四个标准层组成:展示、业务、持久化和数据库(见图
3-1
)。在某些情况下,业务层和持久化层会合并为一个单一的业务层,特别是当将持久化逻辑(如
SQL
)嵌入到业务层组件中时。因此,在较小的应用程序中可能只有三个层,并且较大且更复杂的商业应用程序可能包含五个或更多的层。

Figure 3-1. The layered architecture style is a technically partitioned

architecture

分层架构风格的每一层在应用程序中都扮演着特定的角色和责任。例如,表示层负责处理用户界面和浏览器通信逻辑,而业务层则负责执行与请求相关的具体业务规则。架构中的每一层都形成了一个抽象概念,围绕满足特定业务请求所需完成的工作展开。例如,表示层无需关注如何获取客户数据;它只需要以特定格式将信息呈现在屏幕上。同样地,业务层不必关心如何将客户数据格式化为显示在屏幕上或者客户数据来自哪里;它只需要从持久化层获取数据,在数据上执行业务逻辑(比如计算值或聚合数据),并将结果传递给表示层。

通常,层次结构通过命名空间、包结构或目录结构来体现(取决于所使用的实现语言)。例如,在业务层中,客户功能可以表示为
app.business.customer
,而在展示层中,客户逻辑将表示为
app.presentation.customer
。在这个例子中,命名空间的第二个节点代表了层级,而第三个节点代表了领域组件。请注意,在所有层级上都重复出现的命名空间的第三个节点(
customer
)揭示了一种技术上分区的架构方式,在该架构下领域被分散到各个层级。

分层架构风格的一个强大特点是组件之间的关注点分离。特定层中的组件仅处理与该层相关的逻辑。例如,表示层中的组件专注于处理表示逻辑,而业务层中的组件则专注于处理业务逻辑。这种明确划分使得在体系结构中轻松构建有效角色和责任模型,并且当使用明确定义了各个层之间接口和契约时,使用此架构风格进行应用程序开发、测试、管理和维护也变得更加便捷。

关键概念

在这种架构风格中,层可以是开放的或封闭的。请注意图
3-2
中标记为封闭的每个层次。封闭的层意味着当请求从一个层次移动到另一个层次时,它必须通过下面的一层才能到达下面的下一层。例如,源自表示层的请求必须首先经过业务逻辑层,然后再经过持久化层最终到达数据库层。

那么为什么不允许表示层数直接访问持久化或数据库层数呢?毕竟,从表示曾直接访问数据库比通过一堆不必要的中间步骤来检索或保存数据库信息要快得多。对于这个问题的答案在于一个关键概念
——
隔离性分级。

隔离层概念意味着在架构的一个层次中进行的更改通常不会影响或干扰其他层次的组件。这种变化仅限于该层内部的组件,可能还包括与之关联的另一层(例如持久化层中包含
SQL
语句)。如果允许表示层直接访问持久化层,则对持久化层中
SQL
语句所做的更改将同时影响业务逻辑和表示层,从而导致应用程序具有高度耦合性和大量组件间相互依赖性。这种类型的架构则变得脆弱,并且很难且昂贵地进行修改。

Figure 3-2. With closed layers, the request must pass through that layer

隔离层概念指的是每个层都是相互独立的,因此对于架构中其他层的内部工作几乎没有或者完全没有了解。为了更好地理解这一概念的力量和重要性,可以考虑一个大型重构项目,将演示框架从
angular.js
转换为
react.js
。假设在演示层与业务层之间使用的合同(例如模型)保持不变,则业务层不会受到重构影响,并且仍然完全独立于所使用的用户界面框架类型。同样适用于持久化层:如果设计得当,在将关系数据库替换为
NoSQL
数据库时只会影响到持久化层,而不会对演示或业务层产生任何影响。

尽管封闭的层可以实现隔离层次,从而有助于在架构中隔离变化,但有时候某些层开放也是合理的。例如,假设您想向包含业务层内组件访问的共享服务功能(如数据和字符串工具类或审计和日志记录类)的架构添加一个共享服务层。在这种情况下,创建一个服务层通常是明智之举,因为它从架构上限制了对共享服务仅限于业务层(而不是展示层)。如果没有单独一层,则无法在架构上限制展示逻辑访问这些公共服务,使得管理此访问限制变得困难。

在共享服务层示例中,该层可能位于业务逻辑之下以表示该服务只能被业务逻辑所访问。然而,在这里存在一个问题:业务逻辑不应该需要通过服务护盾才能到达持久性存储区域。这是分布式系统设计中经典的问题,并且可以通过创建开放式护盾来解决。

如图
3-3
所示,在本例中,由于服务模块是开放式的,因此可以绕过它并直接到达持久性存储模块,这样做是合理的。

Figure 3-3. With open layers, the request can bypass the layer below it

运用开放与封闭层概念来界定架构层与请求流之间关系,为设计师和开发人员提供必要信息,使其了解不同层级在架构中所具备的访问限制。若无法准确记录或传达哪些层级是开放还是封闭(及其原因),往往会导致高度耦合且脆弱性较大的架构,该类结构难以进行测试、维护和部署。

示例

为了阐明分层架构的工作原理,考虑一个来自业务用户的请求,要求检索特定个人的客户信息,如图
3-4
所示。请注意箭头显示请求向下流动至数据库以检索客户数据,并且响应向上流回屏幕以显示数据。

Figure 3-4. An example of the layered architecture

在这个例子中,客户信息包括客户数据和订单数据(由顾客下的订单)。在此情况下,顾客界面负责接收请求并显示顾客信息。它不了解数据存储位置、检索方法或需要查询多少数据库表才能获取数据。

一旦客户屏幕接收到获取特定个人客户信息的请求,它会将该请求转发给表示层中的客户代理模块。这个模块负责确定业务层中能够处理该请求的模块,并决定如何访问这些模块以及所需数据(合同)。业务层中的客户对象负责聚合所有获取客户信息所需的数据。随后,客户对象模块调用持久化层中的客户
DAO
(数据访问对象)模块来检索客户数据,并调用订单
DAO
模块来获取订单信息。这些模块依次执行
SQL
语句以检索相应数据并传递回业务层中的客户对象。一旦客户对象接收到数据,它会聚合这些数据并将信息传递回给客户代理,然后由此将数据传递给用户展示在用户界面上。

斟酌与分析

分层架构是一种被广泛理解和通用的架构风格,适用于大多数应用程序,并可作为确定最适合应用程序的架构风格时的良好起点。然而,在选择此风格之前,需要考虑几个与架构相关的问题。

首先要注意所谓的

架构陷阱反模式

。该反模式描述了请求在多个层次间简单传递处理,每个层次内没有或只有很少执行逻辑。例如,假设表示层响应用户检索客户数据请求,则表示层将请求传递给业务层,业务层仅将请求传递给持久化层,然后持久化层再向数据库调用简单
SQL
语句以检索客户数据。数据随后在整个堆栈中原封不动地返回,并未进行任何额外处理、聚合、计算或转换等操作。

每个分层架构都存在一些符合架构陷阱反模式的情况。然而,关键在于对落入此类别请求的百分比进行分析。通常采用
80-20
法则来确定是否正在经历架构陷阱反模式是一个良好的做法。通常大约有
20%
的请求作为简单透传处理,而
80%
的请求与某些业务逻辑相关联。然而,如果您发现这个比例相反,并且大部分请求都是简单透传处理,则可能需要考虑开放一些架构层次,但请记住尽管速度更快,由于缺乏层隔离,控制变更将更加困难。

当初引入时就像今天一样可行的分层架构仍然具备优势。虽然更现代化的分析和设计方法(如领域驱动设计)为开发人员和架构师提供了从领域角度而不是技术角度思考问题的方式,但仍有时候技术上划分体系结构(如分层架构)更加合适。

什么时候考虑这种风格

如果项目或倡议具有重要的预算或时间限制,那么分层架构是值得考虑的。由于分层架构通常被认为是一种单体架构风格,它在远程访问、合同管理以及前一章中描述的分布式计算谬误方面没有复杂性。此外,大多数开发人员和架构师都熟悉分层架构,使其更容易理解和实施。

另一个考虑使用分层架构的原因是大部分变化仅限于应用程序内特定的层级。例如,仅影响用户界面规则的变化、仅涉及用户界面外观的变化、迁移到新的用户界面框架以及迁移到新类型数据库等都只影响到体系结构中特定的某个层级,这样可以更容易地隔离受到变化影响的组件。

由于分层架构是一种技术上的分区架构,因此如果团队结构也按照技术进行划分,这种架构将非常适合。换言之,如果整体团队结构组织为展示(
UI
)开发人员、后端开发人员、共享服务团队和数据库团队等,那么与该架构风格(展示层、业务层、持久化层等)的整体划分相吻合。这种对齐符合康威定律。

什么时候不要考虑这种风格

尽管有许多理由可以考虑前一节中描述的分层架构,但不幸的是,还存在更多原因不应采用分层架构。

首先,如果您对应用程序具有高度的运营关注,例如可扩展性、弹性、容错性和性能等方面,则不适合采用分层架构。因为分层架构倾向于单体式架构,在使用这种架构风格构建的应用程序通常很难进行扩展。虽然通过将各个层拆分为独立的物理部署和
/
或在多个虚拟机中创建应用程序的独立实例来实现分层架构的扩展性,但这样做非常昂贵且低效,因为必须对
100%
的应用功能进行扩展。此外,分层架构并不具备良好的容错能力
——
任何部分发生致命崩溃都会导致整个应用功能崩溃。

另一个避免采用分层架构的原因是当大部分变化发生在领域级别而非技术级别时。假设您被要求在电影流媒体应用程序中给客户

我的电影列表

添加到期日期(即客户排队准备稍后观看的电影)。这项新功能首先需要更改数据库模式,然后修改持久化层中
SQL
语句,并调整业务规则和业务约定(例如到期前多长时间、列表中电影过期时如何处理等),最后还需修改表示层以显示每部电影旁边的到期日期。

在分析对

我的电影列表

功能进行相对简单更改时,我们注意到每个层次的架构都会受到影响并需要进行调整。在大型系统中,特别是那些具有技术上划分团队的系统中,这可能涉及多个团队(如
UI
、后端和数据库)之间的协调来实现此更改。这不仅会影响整体敏捷性(即快速应对变化能力),还会影响完成此更改所需的总时间和工作量。

最后,在跨职能领域团队组成整体团队结构下(即单一团队拥有专注于应用程序特定领域内
UI
、后端和数据库专业知识),分层架构可能不适合,因为技术上划分的架构结构与领域划分的团队结构不一致。

架构特征


3-5
中的图表综述了分层架构在整体能力(即架构特征)方面的评级。一颗星表示该架构特征得到的支持不足,而五颗星表示它非常适合该特定的架构特征。

Figure 3-5. Architecture characteristics star ratings for the layered

architecture

前言


19年的时候我买了一个 matebook14 笔记本,配置是8代i5和8G内存,在当时看来作为轻薄本是够用的,但是现在已经2024年了,这内存让我想起来去年苹果的新款 mac mini ,丐版三千多给了8G的配置,数码圈都沸腾了

效果图

添加了一个NPC(小红鱼),玩家控制小黄鱼

鸿蒙开发游戏(一)---大鱼吃小鱼(界面部署

鸿蒙开发游戏(二)---大鱼吃小鱼(摇杆控制)

鸿蒙开发游戏(三)---大鱼吃小鱼(放置NPC)

鸿蒙开发游戏(四)---大鱼吃小鱼(互吃升级)

鸿蒙开发游戏(五)---大鱼吃小鱼(添加音效)

鸿蒙开发游戏(六)---大鱼吃小鱼(称霸海洋)

前两篇文章我们做了摇杆控制小鱼移动,这篇将会添加一个NPC,让其自动在海洋里游荡,然后玩家控制吃掉它。在这之前我们想思考一些问题,

NPC如何生成?NPC有哪些属性?NPC是如何控制的?如何做到随机转方向?

这是该篇的难点,这里还用到了一些数学知识,包括sin,cos,弧度与角度的计算等,还是比较麻烦的,但是等你看到代码又会发现代码量很少,又会觉得如此简单,好了,看例子。

1、开始游戏

这里我们需要添加一个开始游戏按钮,因为只有玩家开始了游戏,我们启动一个计时器才会变得顺理成章,不然的话,上来就启动计时器会很好资源的。

export struct FishPage {
    @State isBegin: boolean = false
}

这里我们默认是false,未启动状态

build() {
  Row() {
    Stack() {
      // 背景
      Image($r("app.media.bg_fish"))

      if (this.isBegin == false) {
        Button('开始游戏')
          .backgroundColor('#36d')
          .onClick(() => {
          //这里把设置成true
            this.isBegin = true
            
          })
      } else {
          //渲染小鱼
      }
    }
}

2、添加NPC小鱼

我们在开始之前就已经开始思考了,NPC应该有什么属性,起始位置,方向,速度,等,这里暂时不需要等级,下篇互吃逻辑写。

//NPC
@State npcSpeed: number = 3
@State npcFishX: number = 300
@State npcFishY: number = 200
@State npcAngle: number = 0
@State intervalIdNPC_1: number = 1
@State npcSin: number = 1
@State npcCos: number = 1

npc显示需要写在else里面,也就是点击开始游戏后,isBegin=true时

if (this.isBegin == false) {
  Button('开始游戏')
    .backgroundColor('#36d')
    .onClick(() => {
      this.isBegin = true
    })
} else {
  Image($r("app.media.icon_fish_right"))
    .position({ x: this.xFish - this.fishRadius, y: this.yFish - this.fishRadius })
    .rotate({ angle: this.angle, centerX: '50%', centerY: '50%' })
    .width(40)
    .height(40)

  Image($r("app.media.icon_npc_2"))
    .position({ x: this.npcFishX - this.fishRadius, y: this.npcFishY - this.fishRadius })
    .rotate({ angle: this.npcAngle, centerX: '50%', centerY: '50%' })
    .objectFit(ImageFit.ScaleDown)
    .width(40)
    .height(40)
    
}

ok,第一个image是玩家控制的小鱼,第二个image是NPC。

3、NPC动起来

问题来了,NPC如何自己动起来了,这就又用到了计时器,这里如果有其他好的方法也评论区打出来哈。当玩家点击开始游戏按钮时启动计时器,

if (this.isBegin == false) {
  Button('开始游戏')
    .backgroundColor('#36d')
    .onClick(() => {
      this.isBegin = true
      clearInterval(this.intervalIdNPC_1)
      this.intervalIdNPC_1 = setInterval(() => {

        //设置小鱼的移动位置,
        this.npcFishX += this.npcSpeed * this.npcCos
        this.npcFishY += this.npcSpeed * this.npcSin

        this.npcFishX = this.getNPCBorderX(this.npcFishX)
        this.npcFishY = this.getNPCBorderY(this.npcFishY)


      }, 40)

    })
}

这里需要说一下,启动一个计时器,内部是不断地计算npc的位置,getNPCBorderX这个是防止走出屏幕的宽度和高度设置的,当触碰到边框要改变方向。难点也在这

getNPCBorderX(x: number) {
  if (x <= this.fishRadius) {
    x = this.fishRadius + 10
    this.getRandom()
  }
  if (x > this.screenWidth - this.fishRadius) {
    x = this.screenWidth - this.fishRadius - 15
    this.getRandom()
  }
  return x
}

getNPCBorderY(y: number) {
  if (y <= this.fishRadius) {
    y = this.fishRadius + 10
    this.getRandom()
  }
  if (y > this.screenHeight - this.fishRadius) {
    y = this.screenHeight - this.fishRadius - 10
    this.getRandom()
  }
  return y
}

那一个x方向说吧,当x<=小鱼的半径时说明,小鱼已经贴左边了,大于屏幕宽度时贴右边了,这时我们要改变方向,getRandom()就是改变方向用的,至于x=this.fishRadius +10 这个主要是当贴边后,小鱼还在走,就会触发多次if语句,生成多次方向,也就是说会出现抖动现象,感兴趣去掉赋值可以试试。

4、NPC方向生成

这一块是最麻烦的,

弧度 = 角度 * π / 180
角度 = 弧度 * 180 / π

我们认识到的Math.sin,cos,tan等一般都是传入一个弧度,而不是角度(我传入角度老是有问题,这里传入弧度就解决了)

/*随机获取一个角度*/
getRandom() {
  this.npcAngle= this.selectFrom(-179,180)
  // let angle = Math.random()+Math.random()+Math.random()
  // this.npcAngle = angle * 180 / Math.PI
  //这是是求弧度,弧度 = 角度 * π / 180

  this.npcSin = Math.sin(this.npcAngle * Math.PI /180)
  this.npcCos = Math.cos(this.npcAngle * Math.PI /180)

  console.log("角度"+this.npcAngle)
}

selectFrom(startNumber, endNumber) {
  let choice = endNumber - startNumber + 1;
  return Math.floor(Math.random() * choice + startNumber)
}

首先我们需要随机生成一个角度,比如说90度,50度,-120度等

角度是作为鱼头方向用的,我们按照speed速度去计算该方向的值

那么x轴上的值就是x = speed * cos值,如下

this.intervalIdNPC_1 = setInterval(() => {

  //设置小鱼的移动位置,
  this.npcFishX += this.npcSpeed * this.npcCos
  this.npcFishY += this.npcSpeed * this.npcSin

  this.npcFishX = this.getNPCBorderX(this.npcFishX)
  this.npcFishY = this.getNPCBorderY(this.npcFishY)


}, 40)

5、关闭计时器

onPageHide() {
  clearInterval(this.intervalIdNPC_1)
}

记住页面消失时,或者游戏结束时需要关闭计时器

好了,到这NPC防止就完成了。

点击查看代码

2023年终总结——从零到一,从自己,到世界

前言碎语

今年,2023整个农历年很快就要过去了,一定要写些什么。萌生这样的想法,是在期末周复习看到W&M战队的满秋师傅的年终总结的时候。

一年又要过去了,此刻我踩着兔年的尾巴,身下是浩瀚的雪原,写下这些文字。

这一年,是我大一下和大二上,也是飞速成长的一年;是进击的巨人,历经10年完结的一年;是这个世界开始天翻地覆,变得有些不一样的一年。

我好像刚从母亲的腹中出来,热情地探索着这个世界……要总结,就不得不由衷地感谢身边的人们。要感谢父母对我的支持,虽然我已经成为了一个会自己飞翔的雏鹰;要感谢女朋友对我的爱和包容,让我能在这个纷繁的世界和复杂的自我里自由探索;以及各位同学和朋友,南邮给予我机会尝试做rootkit的老师和师傅们,还有各位HASHTEAM和Nepnep的师傅们,谢谢你们。

今年的结尾是在哈工大度过的,哈工大的青训营邀请了各个优秀高校的ctf战队成员来参加活动,这也是我正从冰城上飞过的原因。这是一年的尾章,也是对新的一年的展望。

我在这里认识了来自清华的张老师,虽然感觉我的发言和想法跟不上人家,但是好歹算是接触上了;在这里认识了中科院信工所的博士学长,非常热情也非常资深,不得不说那边的科研条件是真不错;认识了绿盟的马研究员,以及各个非常厉害的教授or研究员(还有一些不能公开说的,懂得都懂就不说了(手动狗头)),真的非常兴奋。

单独开一段,
我们学校的崔老师真是不遗余力的为我们分享知识,非常感激!

整个总结会围绕去过的地方、生活、工作、学习、兴趣、自己一年的思考碎片的集锦展开,前文有目录,可以跳着看。

image

花絮(飞机上瞎说版,可以跳过)

今年我也去到了很多地方……让我想想,从南往北说吧。

广东中山,广州,惠州,深圳……

吃点东西,飞机发餐了。

image

吃爽了,来喝的了,要点橙汁吧。看到前面的人在玩游戏,玩的开心消消乐,之前怎么没想到飞机上玩游戏?一会玩会巨人的猎手再来写哈哈哈哈。

厦门航空,各位,厦门航空,认准厦门航空,真不错。做了南航,东航,九元啥的,除了东航确实可以,厦门的这些饮料吃的,真不错真不错,夸一夸,题外话哈。

刚喝完喝的,去玩会。
image

image

image

image

非常帅嘞,电脑也能玩,一开始手机都不会玩。
接下来正经写了哈。


云星,我所行处

我所行处,与星做伴。从南往北细数,我所到达的地方应该算是很多了,虽然说暂时还没有出国的经历,也不知道以后会不会有。

简单说说今年去过了哪些地方,并挑一些比较重要的写写吧。广东有广州、深圳、惠州、中山,安徽合肥二进二出,山东有青岛、潍坊、淄博、济南二进二出,北京二进二出,黑龙江哈尔滨二进二出,山西有太原、晋中、忻州,河北衡水,天津。

其中惠州和深圳、青岛、衡水是属于出生点,不统计次数,其他不说明则是一次。也许每年会给一些城市小称号,写出一些新的印象。并且,衡水就不专门写了,还没有对这座城市有特别的了解呢。

基本都是公费出行,真实爽到了,成为了自己小时候喜欢的样子:背着一个包,拎着一个行李箱,行走在车站。

当时在东莞,雨夜,我就那么靠着窗户看着那个人,一直记到了现在,终于我也是像他那样自由了吗。

广州——江梦城

广东是我长大的老地方了,这也是从南往北的第一站。惠州,深圳,广州,中山。——今年在这个经济大省里,我踏过了这四座城市。除了回家和出去玩是在惠州和深圳,中山是我单枪匹马参加香山杯决赛,攻防拿到第九名,此时顺路去看的广州,我要好好说说。

广州,珠江新城,我见到了好几个高中同学,大家依然爱笑依然迷茫,有自己的乐趣。我们抬起头,建筑遮挡了天空,我自恃见过“城市”,可是第一次觉得“钢筋森林”四个字来形容大城市是如此形象。

我第一次见到地铁可以那么拥挤,来了一个地铁不代表你一定能上去,人挤人,真正的挤地铁……以前以为是夸张用语,后来发现确实是那样。

我们倚着海心沙和珠江,谈谈最近的变化,看着船从这头到那头。顺着珠江,船到了那头,那头是中大南校。这儿民国气息浓厚,很有许多的底蕴,而在大门外却又是这温柔的珠江。另一位高中同学也在频频点头,似乎说着当年没有说完的话,倚着珠江,看着从昨日邮来的船只。

就好像一直都那么熟悉一样,就好像昨日遗留的船只今天终于邮来了。

可是这座城市的地铁是那么拥挤,似乎人不贴着人就无法继续向前。我们以为在这座城市的遇见,仿佛就像这里的地铁一样,一转眼,就不能再找见。

我迟迟不能入眠。而这座城市也伴随着一声声呼啸和平安,落在了我远远的身后,祖国远远的南方。

合肥——首次城

合肥去过两次,第一次是大一国赛半决赛,第二次是国防科大的暑期学校。这座城市给我带来的感触其实不大,只是发现合肥工业大学附近好多好吃的,中科大不让我进,去了罍街,国防科大待遇很好,环境也不错哈哈哈。

不过从这里开始我发现蛋黄烧卖特别好吃,和队友吃的烤肉特别好吃。

这里有我第一次线下赛的体验,第一次离开学校住酒店,尤其是金碧辉煌的酒店和悠扬的小音乐,作为第一次他一切都是那么完美,以至于后来的出差好像都没有可以与之匹敌的待遇,这是真的。后来的很多次,其实都不如这次,或许是因为国赛的待遇很不错?不过也可能是第一次作祟。

对了,除了吃烤肉,还吃了海底捞,这也是第一次。这座城市可能没去到太繁华的地方,而且国赛半决赛结束的第二天早八就要考物理,而我也没有申请缓考,导致晚上吃完饭马上就往回赶。但是第一次就是第一次,很不错的感受呢。

再来就是暑假,杀了个回马枪,因为半决赛是将近暑假的时候去的。一个很好的师傅告诉我那里有暑期学校的活动,我立马报名,又公费去了一把。在军营里学习、比赛,那段时间产出了不少wp和文章,也听了很多很厉害的讲座,认识了浙大的教授。第一次觉得被老师看好的感觉,他说“我们的方向很match,保持联系”。第一次和一位技术高强的师傅面基了,后来我们也保持联系,他也来了山大,还专门请他吃饭了哈哈哈。

在暑期学校听到了很多前沿的知识,第一次发现原来在网络安全的战争已经进入热武器时代,我却还在进行冷兵器的练习。当“你觉得人工智能会有人类的情感或者智能吗”这个问题从提问人的声带中振动传向中科大计算机学院副院长的脑海时,我就知道不虚此行。他回答:“会。这要看我们怎么定义情感和智能……”

本来差点以为合肥没什么好写的,突然发现我写的并不是城市本身,我想写的是在这座城市里的我,变成了什么样的人。如果单纯写这座城市的样子的话,不如直接放几张照片上来,对吧?果然文字还是有一些不太一样的地方在的。

不过这个输入法的词库真草,我一个小学拿过深圳龙华区打字三等奖的人,1分钟180字给他这个词库搞得磕磕绊绊……

这个城市有太多太多的第一次,我姑且称之为我的“第一次城市”吧。

淄博——枕风城

淄博,好像大家都是因为烧烤所以觉得是一个很值得去的城市,政府大开门路,多请人员招待游客。我们当时并不是因为这个所去,也没有在高峰期前往。当我和某人在火车重逢的时候,是凌晨一点,到达淄博是凌晨五六点的时候。当时万籁俱寂,太阳初升,我们前去了有名的小吃街吃早餐。随后,我们来到了我对淄博印象最深刻的地方——它不是烧烤店,也不是别的什么,这里是淄博人民公园。

早晨七点,小学生开始上学,老人们开始来往,有人在树林里摆上音响,拿起麦克风唱起歌来;也有夫妇倚靠在一起,看着面前的小湖泊交谈;最后我们坐下的时候,面前是一群打太极、耍剑的大爷大妈。树林一阵风吹过,带起湖泊的涟漪,我们的心在此逐渐从虚浮的落为宁静的。

这是一种力量,并不是烧烤所能比拟的。我们好像看见了生活的样子,听见了生活的声音,嗅到了生活的气息。此刻,呼吸是自由的,行动是自由的,就连一草一木仿佛都是自由的。我们总是或是被迫或是半推半就地,从夜晚到午夜,也许是在刷视频也许是在看书,放松、又或许是在赶ddl,总是不知不觉就到了凌晨才能慢慢入眠。第二天起来,要么是被早八拉起,要么是直接睡到十点,一个早上就此消散。

一天的控制都不能随自己,正所谓“一日之计在于晨”,如此的我们 ,对一天的掌控感几乎是没有的。自由?只有午睡时候的懊悔,起来之后忽忽悠悠又到了晚上,然后重复前面的生活。

淄博给了我一种久违的感觉。虽然是火车五点到站,没有办法所致,但是早起和一个温柔的人民公园,我认为是生活必不可少的主食。

这个城市并不繁华,也没有海浪的抚慰,但是他像记忆中的奶奶一样告诉我,怎么生活,怎么爱自己。

济南——好客城

初到济南,看着这里的建筑,给我的感觉就好像进击的巨人变身变到一半未完成。是非常抽象的比喻,不过,也许还可以换个说法。济南这座城市非常符合山东这两个字,也难怪大家会开玩笑“山东济南,中国青岛”。这个城市给人一种一些灰灰的感觉,也可能和当时的天气有关系。而且当时非常的热,以至于我以为回到了海口。

第一次来到这里是因为来看薛之谦的演唱会,我们骑着共享单车到达地铁口,乘坐地铁来到了人山人海的体育馆,度过了非常美好的一个夜晚,又在夜晚赶着到车站。严格来说济南应该是三进三出了,因为从合肥回来的时候,是从这里中转。济南能看出来富裕---,但是似乎少了一些什么。在路过山东大学站的时候,我们差点想下车,当时好像很想校区就在这里一样呢。

第二次来到这里是山东省赛,这可有的说了。比赛还没开始,先看了一段舞蹈和唱歌,原来是在彩排。据说山东的官场文化特别繁盛,那么在这种公办的比赛,招待自然是妥妥的。我当时称之为“比赛最被当人的一次”,有表演看、有东西吃,各种招待。

不过因为是在山东警察学院,地方比较偏,没有去什么特别的地方玩,也没有吃上cyx,希望下次可以去尝尝。一定要写什么感想的话,不得不说确实待客之道让人非常舒服,并且薛之谦演唱会真好看!唱的真好听!第一次发现了耳机和现场的区别啊……

济南是一个很不错的城市,我觉得他的的确确可以代表山东省。

北京——南香城

北京也是二进二出的城市。小时候去过一次,当时还去看了毛主席,当时对毛主席并没有什么特别的感受,直到后来学了政治、读了马哲的很多书籍,以及了解了新中国的历史,心中的敬佩油然而生。不只是毛主席,这是一个伟大的城市,有故宫,有圆明园,有清华大学和北京大学……如果有人一提到他在这个城市,就似乎自带了主角光环一般,说话腰板也能挺直了。

第一次来到这里,我就有这样的感觉。当时是蓝帽杯决赛,来公大进行比赛,我们住的酒店是演员们经常住的,据司机说撒贝宁就经常到这里住。星光开头的酒店,从名字也能看出来了吧。当时就约了我的发小,他在北交上学,本地人直接称之为交大了。我们前去了史铁生笔下的地坛,尽管已经是夜里了。听他介绍这座城市,有比较新的繁华的地方,也有这种比较老的但是文化非常繁荣的地方。平常,这里会人来人往,有人在这里摆书摊,会有名家来交流。这是一个怎样的仙境!

从地坛离开之后,我们便去觅食。来这里当然不是吃烧烤烤肉,而是要吃发小——作为一个“本地人”经常吃的东西了,是什么呢?南城香!没错!如果要留在北京,没有什么别的理由,不是为了他的繁华也不是为了他的薪水!仅仅是因为南城香是真的好吃!

南城香的米饭是什么样的感觉,我只能说生活了十九年,这是我第一次觉得米饭是如此美味。就当我以为肥牛是一种也就那样的食物的时候,这家店给了我一个惊喜。我的味蕾好像第一次被打开了,他并不是像大饭店的饭菜那样花哨或精美的饭菜,他就是一个十几的快餐,但是却悄悄地告诉我:吃饭不只是进食,更是一种享受,类似泡温泉、类似听演唱会一样的享受。对,就好像薛之谦在我的舌头上面开演唱会一般的感觉!

以至于,在此次之后我永远都在想吃到南城香的饭菜。第二次京麒CTF来,更是带领nepnep的众多队友一起吃了。

当然,不排除是因为和发小重逢的喜悦之情,后来每一次吃南城香都觉得幸福,就连写下这段文字的时候都忍不住咽口水,可是结果发现这家店只有北京有!太坏了!就好像厨师是我的知己,知道我喜欢吃什么一样。如果可以的话,能让南城香推出肠粉也许更好呢……

华为、京东,中科院、清华大学,这些以后我大概率会邂逅的大世界,他们都在这座城市,这座被大家感慨在这里会感到渺小的城市。的确会感到渺小,并不是北京为每个人带来了光环,而是只有真正的精英才会来到这里。京麒CTF的时候真的是被完全虐爆,不论其他人有没有场外援助这一说,但是这一场比赛绝对是我遇到的大佬最多的一次。

不过话说回来,蓝帽杯拿了国二,至少说明我还是ok的,并没有给大家拖太大后腿的,对吧?

这座城市的能量太大,所以重逢大概率会在此相遇。之前还有一位玩VR认识的哥哥还尚未见面,之前实在是把他忘了,这次新年拜年了谈到,那么我们后会有期吧!再会,北京!再会,南城香!

南城香,你是真好吃……

山西——古道之地

山西去了太原、晋中、忻州。这三座城市给我的印象其实是非常统一的,而且也是一趟去的,所以就排在了一起写。

第一站是忻州,这个地方是篮子哥的家乡,也是某人的家乡。非常巧,我们住下的第一站就是在她初高中的附近。

不得不说,这个地方仿佛就是为了照应我一般。

到达的当晚,我们前往了忻州古城。在出发前,一切正常,然而就在出发没多久的时候,顿时云雾升起,霾作拥趸,仿佛周围成了仙境一般。下车之时,就是成仙之刻!

我们摸索在仙境里前进,周围的古建筑扑面而来。如果是在青岛有雾,那些枯树只会像抖音上的朋友形容的一般——这是寂静岭!但是这是在忻州,这是在山西!古城墙,古城门,古色古香的灯笼,一排人缓缓向前,好似阴兵借道!但是,这是吓人的景。我们牵着手走过这也许是中国几百年前的石板路,就好像正在穿越迷雾,走向中式婚礼的殿堂,这是美好的景。

这是一座城!这是一座城!并不是城市,这在古代是一座城啊!

她带我品尝了剔尖、碗托、山西凉皮等众多美食,我赞不绝口。她也笑嘻嘻地说:“你真是不扫兴!”然而,谁不知道这玩意是真好吃!

在忻州古城里,古代现代一应俱全,就好似大型商场将所有楼层平铺到了一楼,还多了些许路边摊的烟火气。再加上这天雾霾仙气的加持,仿佛真是置身于几百年前,又好像深处未来,十分梦幻。

忻州对我的照顾可不止这一天。第二天,祂就给我这个南方人天降大礼,给我下了一场大雪。

没错,和昨天一样,出门之前没有任何迹象,一旦出门,开始飘雪!我们漫步了她的初中、高中,回忆了很多她的过往。我也想带她回到我的高中、我的初中,说说我当时的生活。

在此之后,我们来到了太原。太原的钟楼街十分繁华,更加热闹,同时也是中式古建筑和现代的完美结合。而且,物价特别实惠,这也是整个山西的整体基调。我们还在这里挑了给各自父母的礼物。这个城市非常适合来玩儿,因为祂的性价比非常高,绝对比其他地方要来的好玩。

最后一站是晋中,这是到我朋友家里玩了。这个城市距离太原特别近,以至于去太原机场只需要二十多分钟,为我去哈尔滨参加青训营提供了极大的便利。这座城市可以说是一应俱全,要啥有啥,而且房价物价都不高,据朋友所说高中的压力也不是很大,算是非常宜居的城市了。

比较可惜的是,没有去五台山(在忻州),也没去平遥古城(这个就是在晋中),所以也许以后还会有更多的感触会在后面的年终总结进行描写,但是因为在山西待的时间并不长,总体的印象确实就是一个古道之地了。还能找到第二个省份,有那么多古建筑吗……确实应该是没有了。

哈尔滨——冰之城

哈尔滨也是二进二出的城市。第一次是夏天,蓝帽杯半决赛, 由哈工大承办的。第二次来,还是和哈工大不解之缘,第一届网络安全青训营。第一次去,只听说了红肠特别好吃,于是在秋林里道斯带了一些红肠给某人。第二次去,则是和夏天完全不一样的场景。

第二次去是什么时候?当然是冬天!2023~2024的冬天,哈尔滨火爆全国,而就在这时,我们正好收到了邀请,让我们去哈工大参加青训营。除了哈工大和各个老师的专业素质极高,酒店待遇颇不错之外,还有哈尔滨本地人的热情和幽默都给我留下了深刻的印象。

我们参观了安天集团的办公楼,去了中央大街、索菲亚教堂,以及看了一个大桥(不过暂时想不起来了)。

当然,让我印象最深刻的就是中央大街之旅了。——我们徒步前进两三公里。一开始队友还说要不要买点烤红肠,一看价格,嚯,十五元,算了。老师推荐我们吃马迭尔冰棍,零下二十度,吃冰棍?!十块一根,不过你别说,这和一般的冰棍还真不一样。

我当时还兴奋地录像呢,准备剪视频上传。我也是在这个时候萌生了相当自媒体博主的想法,讲讲自己CTF的比赛经历之类的。然而,就在我只不过是想放个手套,用嘴巴叼住冰棍的时间,一下子我的嘴就被冻住了,要往外扯?疼得不行!在这个天气吃冰棍可是不能用舌头的,更不能用嘴唇碰到,只能用牙齿咬,后来在路上还听见情侣中女生说:“你用牙齿咬!”看了看队友们,基本都是吃出血的,但是血从哪来,却不知道。

嘴被冻住了,我也不笨,一下子就冲向最近的一家店,因为里面肯定有暖气,会将其融化我就可以解救了。结果一下子东北大姐们就马上围了过来,好像看到了他们的小时候的自己一样。“哈哈哈哈哈,你怎么了?”大姐笑着问我。我说,我给冰棍冻住了!他们一下哈哈大笑,说我要是拍视频肯定会火,太搞笑了。

他们一边嘲笑我,一边把我送到暖气的出口处,告诉我不要扯,他们小时候也这样。一片笑声中,我差点又想往外拔,结果疼得不行,他们紧张的告诉我不要拔,这样的话会把皮扯下来。就在他们的帮助下,我的冰棍一点一点扯下来了。

结束之后,他们还开玩笑让我给他们宣传,我毕恭毕敬地收下了名片和宣传小手册,然后笑着告别。我也非常信守诺言,马上就在新的视频里给他们旅行社打了广告。

在这之后还走到了斯大林公园,肃然起敬!

在这里认识了许多新的人, 也感受到了这里大家的热情好客。由于是在中国特别北的地方了,也体验到了一些以前没有的东西。不过,比较可惜的是,两次来都没有遇到小学六年级的班主任,约了两次,结果都在带高三,要么我没时间要么他没时间,实在是可惜。不过也许以后还会有机会吧。

哈尔滨二进二出,大概率以后还会再见的。不过,作为冰城的你真有魅力呢!还有桥下的大江!

天津——魅港城

这是一个古怪的城市,是一个好玩的城市,是我今年最后到达的城市。来到这个城市,有一个重要的原因——以后有可能考虑在这里生活。当然并不确定,所以选择来到这里看看。

这座城市的人们安乐自得,搞怪无比,这也是后来从网上看到的。但是就从我个人的体验来看,也许是因为当时是冬天,海河都还是冻结的,不过尽管如此,还是会有人拿着小雪橇给大家在上面滑雪玩。这里的红绿灯并不是一红一绿,而是一个大大的竖着的椭圆,绿灯的时候是一个高高的绿色小人,红色的时候则是红色的小人,看起来非常喜感。在津湾广场,这里拥有许多民国时期的建筑,有地铁站(嗯?),冬天的津湾广场并不热闹。意大利风情街倒是有些人,但是由于季节的原因也没有特别热闹。买蜜雪冰城的时候,注意到海河边,有大叔摆起音响大声唱歌和直播。

传说还有一个很有意思的书店,我没有前往,也许下次会来。相声茶馆不停的吆喝,我也没去,后来刘谦就在这里面演出了……也许是这个相声茶馆吧。总之,还有很多有意思的事情没有做,不过还是吃了煎饼果子的!但是……很多事情也许在这里未完待续。

拍下世纪钟,走过解放桥,跨过海河,越过津湾广场,已经特别晚了。我走进一家大商场,好像是新天地。我的身体酸痛已久,就在此时,我发现商场内有个地方正在卖按摩椅。我立马就前去想尝试。

这一尝试不要紧,一尝试大姐给我招待的可好,给我试了试,以后真的考虑在这里买买。那个按摩椅是真的舒服,把整个人都包裹进去,全身按摩。一边按摩,一边和大姐聊聊按摩椅怎么卖,从有的客户不孝顺、到有的客户孝顺,再到这个产品分多少类,哪些有力哪些没力气,可是居然老人能受得了有力的,一些年轻人却受不了。

这一说不要紧,嘿,我说我就要试试那个力气大的,那是一个酸爽。我们聊天的话题逐渐走向了其他地方,比如——天津这个城市怎么样?大姐说,她就是天津本地人,肯定不会说这里不好。我说,那你说说哪里好呢?她说,很久以前这个地方没有这么多人,当时都是夜不闭户,走路去上幼儿园、上小学。很多时候,玩累了,小孩们直接在街边打地铺,就那么睡过去了,都没事儿。我不得不想到河南的某些地方,一到晚上就连现在都还有拐卖人口的风险。她还说,这里其实有些人特别厚道,但是有人脸皮厚起来,本地人都宰。

有一次下大雪,就那么几里路,她寻思做个车回去轻松点吧?结果没想到,那个司机开口就要50,不然不让做。不仅是50,这个司机还要拉别的客人。这可不是宰人吗!但是还有一次,她回去的时候,那个司机直接带她,恰好送到快到家的路口。这是为什么呢?司机说,再往前走,这个表就开始跑了,你就要交钱了,所以你从这里下,去吧!司机没向她要一分钱。

其实,在任何城市都会有好、也有算计的人。但是天津这一片,要文化生活,这里有丰富的博物馆和书店、以及相声茶馆任君享受;要经济生活也有经济生活,这里一样有CBD,有各种风情街和广场,同时也可以去海边玩乐;要交通,这里有高铁站、火车站、地铁站,随时可以前往任何地方,机场也不是特别远。如果要定居,这里真是一个不错的选择。请教了高中同学,如果在春天来,或许能见到更美的海河,更美的天津。

也许,以后还有机会再见吧。天津!

天云,行处之我

说完了我去过的地方,接下来该说说我自己了吧。

技术——从零到一

得按照时间好好说说。2023的开局,我还是一个大一的小白,刚刚学完ret2libc,但是还没有涉足太深。各种灵异事件此起彼伏,于是不得不学习汇编语言来相信科学。于是,年开局我就在学习王爽汇编,配合小甲鱼的课程。所以在今年,加上辅导女朋友写汇编,我的汇编能力和调试能力得到了十足的巩固和提升。

与此同时,在接近暑假的时候,我搁置了很久的堆开始学习了,不过学完了基本的bin attack就没有再深入各种house了,无非是各种attack的混合,加之利用越来越繁琐,偶尔学了一些house之后就放弃掉了。转向了栈溢出漏洞比较多的IoT,这也是我今年年末所开的一个新的方向。我甚至还给新买的物联网安全书籍提供了两个刊物,并且得到了致谢。

image

另外,开始跟着nepnep的师傅复现CVE,并且打了realworldCTF,开始越来越向实战世界靠近。今年还第一次提交了一个linuxqq的小漏洞,获得了小小的安全币。除此之外,今年还在合天网安和Freebuf发布和被精选了多篇文章。

我开始关注到现实世界的漏洞,并不是直接就能pwn那么简单,需要构造数据包,需要逆向各种输入的结构,并且要分为两步:一步是泄漏,另一步才是直接攻击。其中,逆向分析和调试都是必不可少的能力。

我也逐渐理解新手和我、我和大佬们的差距,并不在于知识点,而是在于对伪代码的敏感度、对gdb的了解和使用方式是否深入,以及对攻击脚本描写的经验和思路的灵活性。这些众多因素影响了一个人能力的高低,而这也应该是我在IoT安全路上需要关注的。

从真实的角度剖析,我缺乏耐心逆向分析的能力,也缺乏对新事物了解的渴望。我需要保持克制,克制于眼前的工作,需要学会开放,开放于工作中需要了解的新知识,由此不断学习、前进。

hack to learn, not learn to hack

总而言之,今年的进步就是从无知到有知,从无为到有为。更简单来说,就是从0到1了。虽然远比不上其他的大佬,但是也很庆幸,算是开始了第一步了。

生活——解放自我

我曾经一度陷入不断努力的怪圈,变成了一个无趣的人。我忘记了我的音乐,忘记了海边的美好,忘记了许多。张口闭口的言语无非就是:我今天干了什么什么,是有意义的;其他时候干了什么什么,是没意义的。这简直就让我失去了生命一般!感谢某人一下就点醒了我。

我想要奋斗的生命,而不是用生命去奋斗!我不想我的一切,消失殆尽于工作学习上,泯灭了我的人性。我开始重新认识这个世界,不被工作、学习、技术所迷惑。这一切,都是为我的生命服务的啊!人的生命就那么一次,千万不要在这样的新时代,活成了自己或他人观念的奴隶。

我开始发现,熬夜是一个不可控的东西,他来自于“当前的东西没有完成”。可是当我十一点,开始泡脚,做一些和工作学习毫不相关的事情的时候,热上一个热牛奶,泡完脚之后,喝下热牛奶:“今天结束了!”缓缓到床上,此刻才不到十二点。这时,第二天八点前醒来,那种幸福的感觉是不言而喻的。

此刻,世界不再是我的仇人,而是我最好的朋友!生活的气息,应当从每时每刻的当下去感受,“认真地对待每一件事、每一个人”是一个美妙的祝福,希望我能够做到。当然,也希望认真地对待自己。

我带着美好的体验奔赴全国各地,珍藏的感受化为了上文的礼物,此刻赠送给各位和未来的我。2023年是疫情开放的一年,是这个世界洋溢着自由和开放的气息的一年。

而我的生活,也开始敞开——不再拘泥于剧本,活出想要的自己。

也许,后面我会考虑gap year?

绩点——从颠簸到平稳

绩点自然是一个不能避开的话题。不过我开始发现,b站的网课有非常多高质量的,能够进行学习。我完全可以在课程还未开始前先过一下,这样就可以避免老师讲到我还没学过的地方的问题了。简单来说就是预习了。

这一年有两次考试,大一下和大二上。幸好大一上的开局还算可以。然而由于比赛,大一下考试的时候只复习了物理,高数和离散数学几乎可以说是裸考,于是大大的2.0写在了我的脸上,我的绩点飞流之下三千尺。这还不算,最后学年结束清算加分的时候,我还漏报了不少,导致最后奖学金评定的时候,仅仅差一名与我失之交臂,当时真是可惜万分。不过后来拿到了自强之星的称号,也算是失之东隅收之桑榆了。

大二上的考试可不含糊了,这次没有不听某人的话,好好分配时间、复习了公钥密码学,把所有的科目都覆盖到了,最终考得还算理想,平稳上升了一些,加上我的竞赛方面,竞争力应该还是比较足的。

新的一年,希望继续保稳,踏踏实实学习,因为大学的系统性学习其实也是非常难得的。继续平稳前行,不负自己。就算最后不能保研,就业也是一个不错的道路。尽人事,听天命吧。

比赛——线下赛忍者

今年是我变化最大的一年。人家是女大十八变,我是
十八变女大
男大十九变。这一年,疫情解封,所有的线下赛开始回归。从第一站合肥国赛半决赛,获得华东北赛区三等奖,就开始一发不可收拾,从此前往济南省赛获得省二,哈尔滨半决赛一次北京决赛一次获得蓝帽杯国二,还上了山大官网首页。接着是北京第二次前往,拿到了全国第十六名的成绩。

差点忘了HWS也是拿了三等奖的,补充一下。

今年我正式成为了HASHTEAM战队的一员,也顺利在暑假的末尾进入了Nepnep战队,跟随了Nepnep战队打了一次realworldCTF,没有做出太大的贡献也没有拿下很好的名次倒是。

不过我发现,比赛的过程其实就是学习交流的过程。因为自己也做了几次出题人,也和各种出题人交流了很多,了解了出题人背后的思想——实际上就是想把自己的知识,以题目的形式传授给大家学习。

所以所谓的“坐牢”肯定是会有的,除非是放水的比赛。只要是不放水的比赛,都是出题人的新知识,那么我们就一定会坐牢。但是坐牢不要紧,我们要勤勤恳恳在牢里好好的学习,学习出题人想要告诉我们的东西。包括NepCTF的HRP师傅,想要告诉我们学pwn也要学web,不然在实际做不了什么!于是就有我人生第一次的http题目。同时也有后来HIT2024的计算器题目、HWS的题目等等。总而言之,比赛的本质就是交流会,选手的本质是学生,出题人的本质是分享者。用平常心和认真的态度对待每一次比赛。

正所谓“当你胜时,胜败在剑;当你败时,胜败在心。”就是这样的道理。

音乐——寂静与萌芽

今年的音乐生涯,并不是特别丰富。以前以为上了大学就可以丰富了,结果发现灵感最喷涌的时候却是高中。不过也不得不分享一下,今年的音乐总播放量突破了七百万了。今年发布了高三写的《仪式》、新写给某人的《明明》,以及一首《自白》和《雾》。我是云,那么某人就是小雾嘛。好几次听着《雾》睡觉用的。这首曲子实际上用的是高一时候从3a那里学来的技巧了。

当然,现场的部分,我在说唱社活动的压轴表演了打碟,虽然效果远没有高中那么好,全是自己喊麦。不过,我也参加了十大歌手,留下了帅气的影像。两次上台演唱了《明明》,那一刻就好像我在开演唱会一样,非常让我沉浸在其中。音乐给我带来的热爱和希望,我永远不会忘记。音乐就是我的生命。加上今年我去看了薛之谦的演唱会,现场的魔力更是让人无法阻挡。

说干就干,我一拍桌子就去查了CEM的线下课,多少钱?十几万?!算了算了。于是一拍脑袋转之买了线上课,也花了一笔小钱。购买了必备的混音、音色设计,以及三个风格的课程:电子科幻配乐、melodic dubstep和混合trap的课程。接下来我可不能忘了我的热爱和付出的金钱啊!一定要继续迈进。

今年我还选了袁老师的音乐课,他告诉我,要在自己擅长的领域做大做强,不要东弄西弄。我深以为然。我唱不了假声(除了花海)基本是既定的事实,然而我的声音温柔,一定要好好发扬这个路线,如《冬花》和《明明》一般。

我的梦想渐渐萌芽,随着江烟的脚步,起航。

展望——不虚此行

我希望,在新的一年里,我的技术能够在IoT方面继续深入,至少挖到一个实际的IoT安全的CVE漏洞。

生活当中,我想我逐渐获得我生命的自由,逐渐触碰真实、爱和获取更高的能量,这么说有点抽象了,简单来说,就是希望我过得更加的自由,而不是更加的拧巴、同时也希望感情生活能够在2024稳定下来。

单独分一行,因为专业和自己懒惰的原因,身体每况愈下。希望新的一年我能够好好锻炼,保持好身材和健康,希望明年我回来看的时候我的体重起码在150以下。

绩点,今年是最为关键的一年,我不求大富大贵,只求不要下降,保持在当前的水平就好,那就已经非常棒了,不论如何平常心是最重要的。

比赛,今年的比赛并没有太过于追求了,只是希望能够辅助学弟学妹们拿到更好的成绩,作品赛努努力拿一个比较好的奖项。大三的话再整一个比赛能加点分就挺好啦。

音乐方面,一定要突破自我,学到新东西,做出好东西来,不能再一边刷视频玩游戏一边把热爱置之不顾了。明年的我,给我一个大幅!


尾记

我今年的日常思考或诗歌

开头的第十几章,说明当前进行的还是《独奏者》的内容,后面从第一章开始的是《独奏者2》的内容。在这里记录也是怕自己忘记了自己珍贵的思考了。

由于2022没写年终总结,把2022年末的一些也放在这儿了。

2022

2022.11.27

欲望诱人索取,但爱让人克制;
绝望锁住行人,但爱就是钥匙。
爱是意外,爱是异端。
爱是秋夜深山湖里倒影的月。

别把自己的梦毁掉,那是多少人不敢想。
不敢做的事,那是你的锁,也是你的钥匙。

这个来自u3rt早期的语录。

2022.12.9

偏见误解如江河之雾,
纵你让世人不见其本,
终不碍江河奔流入海。

——《第十章·山海》

2022.12.24

阴差阳错买了票,要离开自己最爱的人和最喜欢的舍友和同学们。感觉都是离别的伤感,好像毕业了一般。
满心失意与对下学期的憧憬,不禁动笔,遂成此诗。

​ 十二月别

半粟丰年沫雪亭,圆缺盛落浪难平。
来年旧月花开过,万簇春风冠发青。

2022.12.25

不要为了未来丢了现在。

2022.12.27

越来越觉得不管是感性还是理性的事情,都存在一个共性:你越想节约时间,越想走捷径,就越会付出比原本更多的时间和精力。

2023.1

1.10

等待是一种浪漫。它让你从原本轨道的狂风骤雨中抽离,来到一片由你自由开垦的旷野,拥有片刻的自由。

1.11

不要用比身高的方式,

请用攀登的方式去看待山。

2023.2

2.7

我最想逃离的城市

从未挽留我。

2.8

飞机是云海的轮渡。

2.24

鸟兽散的可能散了
还有未散的
慢慢死着,
却也有零星仍在飞翔。
“一切的一切”是鸟兽的托词。
神把他们抹去,
或在某天归来。

2023.3

3.1

少年维特即使身处未婚夫之位也会将自己击得七零八碎。

没有pwn和音乐,我的精神世界就完全被数据结构与算法侵袭,把我的灵魂啃食得细细碎碎,任由我在暗海的空中消散。

3.2

“常常流浪
在梦里捞起一个故乡
风一吹就破碎
从此
我知道了星星的来历”

——《第十五章 破碎》

3.2

未见过与未理解的都以圣洁或狰狞的姿态出现,却都在会面以后化为平凡。

3.11

我们都不是功力超群的人,但勇气让我们存在,即使下一秒粉身碎骨。

备注:看刺客伍六七剧集有感。

3.17

我发现了摸鱼守恒定律。有一段时间不管你是干什么,反正你总是得摸鱼的。

补充:所以不如好好主动认真的摸鱼。

3.27

人在情绪化的时候就会回归于小孩。成人大可以简单地打败他。如果你不是来打败他的,请用对待孩子的方式让孩子平静。

——《第十七章 文艺复兴》

2023.4

4.2

愧疚产生于失误或压迫,却不知降临在哪一方的身上。愧疚是世界疯狂的边缘。它看起来像爱却不是爱。它是天堂深处的地狱。

——《第十八章 黑暗之外》

4.11

如果你对推论和事实的冲突感到迷惑,那么很可能你的公理早就错得非常彻底。

——《第十九章 无相之相》

4.21

学知识让人走的更远,读书则让人走得更高。

4.21

在知道问题怎么问的情 况下,提问是一个很好的学习方式,尤其是当你有很多人才朋友。

2023.6

6.7

有地方想去就能去的感觉真好啊。
以前是江,现在是海。

得到评论:行所欲至是一种很幸福的自由。

6.12 解密了高三的诗歌

image

下面这个不是我写的,是同学写给我的,下下个是我回他的。当时是高三晚自习。
image

image

image

image

2023.7

7.4

只见他伸出双手向天祈祷:“please!please!”顿时云风大作,飞雨降临人间。得到了苍天的指令,南区的火蓝匕首正直直地刺向北区深处……后人传之,有诗曰:高鹏振翅萧山去,鸿风飒飒吹飞雨。

以上来自于军训,同学求雨而得。

2023.8

8.7 独奏者2开始

哄了场美梦
云笑着噩梦
梦啊梦啊梦

梦不尽
不知道进了谁的口袋

——《第一章 魔》

备注:后来第一章改名为退潮了。

8.19

好久不见,我的朋友。
你最大的愿望已经实现,
你怎么了?

曾经的单枪匹马
破日穿云,
侠肝义胆言壮志。
八百里血河渡,
九千里浩岳翻!
提笔敢书天下,
铸剑直指碎天高——
呜呼哀哉!
如今黄河去,
长江付东流。
沙尘裹尸北天落,
凌迟花梦醉炉烧。
烧啊烧,飘啊飘,
烧不尽,飘不散。
周公丧蝶,太白酒涸,
不见红日出墙来!

欲说日出 还日落?
再聊斋异 话诸生…………

——蔡原 2083.7.50 于枫叶刀市

8.23

绩点让我焦虑,比赛让我疲惫,某些作业让我疑惑世界上怎么要做这种奇怪的东西。兜兜转转这么多年,还是只有做音乐让我像窝在大沙发里一样舒服,不会焦虑,不会疲惫更不会疑惑……只有激动又柔软的快乐和幸福。

2023.9

9.9 看奥本海默后。

既有花期死,天时绽漫山。
龙声无觅处,焰海啸苍天。

9.16

灵感来自暂停和休息,从不来自忙碌和伟大。

9.17

“奥本海默和爱因斯坦,你会选哪个?”
——《南枝·尾声》

2023.10

10.21

“不能做的事情”,才更值得做。

当时作品赛项目被大家不看好。

10.22

原话来自马走日出。

image

10.23

正视时一切恶魔与神灵都消散。
——《第一章 退潮》

备注:发现写过类似的思考了。

10.26

​ 海夜

古月家音散雾飞,飞花帝命奏天罗。
山翻海越烟竹匿,不可说埋不可说。

10.27

我发现人做事和坐车是一样的,要经常离开座位走走,不然就会头晕不舒服

10.29

image

2023.11

11.19

“人们总是喜欢遥远的人们,忽视身边的羁绊;喜欢未来的梦幻,怀疑当下的苦楚。”

——《第三章 潮起》

11.20

image

2023.12

image

2024.2

2.7

​ 纪一年成画
山花易采路难行,百里涂肝梦夜明。
大墨豪挥天地落,孤舟笠士化龙睛。

最后的最后

现在写完已经是凌晨一点了。很高兴伴随大家一起完成了2023的二次旅途。希望2024年,本文的展望能够实现。当然如果都实现的不是很理想,至少完成一点:身边的人和自己平平安安,健健康康,足矣。

最后恭祝各位,新年快乐。

文章完成于2024.2.16 凌晨一点 衡水

原文 | James Montemagno

翻译 | 郑子铭

Visual Studio 2022
在 2023 年发布了许多令人难以置信的功能,为 .NET 开发人员提供了大量新工具来提高他们的工作效率。有这么多可供选择,我精心挑选了一个包括编辑器改进、生产力更新和人工智能辅助的选项。让我们来探讨一些最有影响力的功能,这些功能已成为我日常开发流程中不可或缺的一部分。

1. 开发隧道

对于需要将本地开发服务器暴露到互联网的开发人员来说,
开发隧道
是一个游戏规则改变者。它提供了一个直接通过隧道连接到您的本地计算机的唯一 URL。对于移动开发等场景来说,此功能非常宝贵,您需要在各种设备上测试后端并让它们与本地服务器无缝通信。

  • 使用唯一的 URL 公开您的本地主机开发服务器。
  • 对于移动开发很有用,允许设备连接到本地计算机。

Securely test and debug your web apps and webhooks with dev tunnels | OD121

2. HTTP 文件和端点资源管理器

HTTP 文件和 Endpoint Explorer
是一个动态组合,可以增强 Visual Studio 中的 API 开发和测试。每当您创建 Web API 时,它都会添加一个 HTTP 文件,您可以在其中发出请求并查看实时响应。端点资源管理器对此进行了补充,它提供应用程序中所有活动端点的可视化表示,允许您生成请求并简化工作流程。

  • HTTP 文件允许您使用实时请求和响应与 Web API 进行交互。
  • Endpoint Explorer 提供了一个可视化工具来查看所有 API 端点并与之交互。

3. GitHub Copilot 和 GitHub Copilot 聊天

GitHub Copilot 和 Copilot Chat
对于寻求 AI 支持的开发人员来说非常出色。 Copilot 在您键入时建议代码片段,使用应用程序的上下文来提供相关建议。 Copilot Chat 允许您与 AI 进行交流,以获得有关编码挑战的更详细的帮助。

  • GitHub Copilot 实时提供代码建议。
  • Copilot Chat 可与 AI 对话以获取编码帮助。

4.Git 和 PR 增强

Visual Studio 2022 在集成的
Git 功能
方面取得了重大进展,简化了代码提交和协作过程。开发人员现在可以直接从 IDE 执行 Git 任务,例如创建分支、提交和拉取请求,从而简化了代码存储库管理的过程。

  • 使用集成 UI 创建和管理 Git 存储库。
  • Link 致力于 GitHub 问题以实现更好的协作。
  • Visual Studio 中内置拉取请求创建和审查。

5. 大括号着色

此功能通过用
独特的颜色
区分大括号对,为您的代码增添一抹色彩。这个小而强大的功能可以通过更轻松地在视觉上匹配左大括号(尤其是在嵌套结构中)来显着提高代码可读性。

  • 颜色区分不同嵌套级别的支撑对。
  • 提高可读性并有助于快速识别匹配对。

6. 拼写检查

Visual Studio 2023 中我最期待的编辑器改进之一是内置
拼写检查器
。这是一个方便的工具,可以让我避免在职业生涯早期犯下的一个臭名昭著的拼写错误,在整个源代码中我拼错了“shield”,直到它被抓到为止。该拼写检查器的工作原理与 Word 或 Google Docs 等文字处理程序中的拼写检查器类似,并且可以轻松打开和关闭。只需在工具栏中查找带有复选标记的“ABC”图标即可。

怎么运行的

  • 拼写检查器会检测拼写错误的单词,并用蓝色曲线在它们下划线。
  • 您可以选择忽略建议、禁用拼写检查或从上下文菜单中将拼写错误的单词替换为正确的单词。
  • 拼写检查器对于保持代码注释和字符串文字的准确性非常有益。
  • 通过创建要在 .editorconfig 文件中排除的自定义单词词典来进行自定义。

7. 辅助功能检查器

创建可访问的应用程序势在必行,而 Visual Studio 的新
辅助功能检查器
使这项任务变得更加容易。该工具可帮助开发人员识别并修复应用程序中常见的可访问性问题,确保每个人都可以使用它们。

怎么运行的

  • 开始调试您的 WPF 应用程序,然后单击“扫描辅助功能问题”以运行检查器。
  • 该工具将突出显示任何可访问性错误,例如空属性名称,允许您直接从结果中修复它们。

Make accessible XAML apps in Visual Studio

8..NET Aspire 支持

Visual Studio 2023 引入了
.NET Aspire 编排
,这是一项简化云原生开发的预览功能。通过在 Visual Studio 中集成 .NET Aspire 工具,开发人员可以快速构建云就绪的解决方案,集成运行状况检查、服务发现和弹性。

入门

  • 您可以从提供的模板创建新的 .NET Aspire 项目
  • 将 Aspire 组件添加到现有项目中。
  • 模板设置提供对服务默认值、跟踪指标等的支持。

9. 界面刷新

UI 刷新
绝对令人赏心悦目,它带来了微妙的更新,提升了整体用户体验。刷新包括更现代的 UI 元素,如浮动选项卡和圆角半径,以及新主题。

10. Visual Studio Code 的 C# 开发工具包

C# 开发工具包借用了 Visual Studio 中的一些熟悉的概念,为 VS Code 带来更高效、更可靠的 C# 体验。无论您是快速编辑 C# 文件、学习 C# 还是调试后端 API,这种方法都能确保您获得良好的体验。 C# 开发工具包由一组 VS Code 扩展组成,这些扩展共同提供丰富的 C# 编辑体验、AI 驱动的开发、解决方案管理和集成测试。如下图所示,C# Dev Kit 包含:
[C# 扩展](
https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.c-
sharp)提供基本语言服务支持,并继续独立于此项工作进行维护。

Packing light with VS Code and the C# Dev Kit | .NET Conf 2023

概括

Visual Studio 2022 有很多值得喜爱的功能,您最喜欢的功能是什么?让我们在评论中知道!要更深入地了解其中任何一个,您可以查看
Visual Studio 博客
,这是了解最新功能的绝佳资源。想看看其中一些功能的实际应用吗?看看我的
前 10 名视频

My Top 10 NEW Visual Studio Features of 2023

请继续关注更多更新和快乐编码!

人工智能辅助内容。本文部分是在人工智能的帮助下创建的。作者根据需要审查并修改了内容。
了解更多

原文链接

My Top 10 NEW Visual Studio Features of 2023 for .NET Developers

知识共享许可协议

本作品采用
知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
进行许可。

欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接:
http://www.cnblogs.com/MingsonZheng/
),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

如有任何疑问,请与我联系 (
MingsonZheng@outlook.com
)