博客两周年,带来了什么?

前言

根据github托管仓库的提交记录,我的这个博客网建于2022/4/10,倒也是马上就要了两周年了,去年这会很忙,倒是没想到做一个一周年回顾,这次就一起补上吧。
近日小小燃起了一下修缮博客的激情,比如加了桌宠,播放器,亚克力风格的卡片,圆角,目录卡片之类的。也奇怪,似乎我就是非常热衷于做这些很游离的事情,做了,会花很多时间,不做也不会怎么样。想说自己还是有颗匠人/艺术家的心,还是很痴迷于这种永远在路上的项目的。做这些可爱的,美美的东西,真的很治愈啊。很多项目,很多科研,换个人,一样做,但博客,模组,辩论这些东西才是真正反映我们内核的东西。

小小的回顾

我对于hexo的初识源于我的室友,他当时先入了hexo的坑,然后和我说,hexo好啊,拿来写博客针不戳。
不得不说,虽然hexo的架构非常简洁高效,但原landscope主题实在是太丑了,丑到让人感觉是原始人刚驯服互联网时捣鼓出来的东西。
于是乎在建站的第一天,我就踏上了主题,美化的不归路。那几天就真的也没干别的事情,就是不停地在github上找合眼缘的主题,然后磕磕绊绊地替换,部署,再更改主题内容,最终选了一个icarus的魔改版,当时真的觉得圆满啦!
现在想起来当时真的啥也不懂,安装个npm的包都能耗这么长时间(毕竟当时专业完全没接触网页相关的计算机知识啦),明明这些事情半个小时就能搞定。也庆幸自己当年的初生牛犊,今天的自己做这些事情从容了很多。不过自己当时好像github都不咋会用,这有点不应该呀。

之后就主要在vim里面写写markdown博客,但也没有坚持多久,可能就陆陆续续发了几篇技术文档,就把hexo冷落了。

再往后主要就是用obsidian记录技术文档了,因为写起来很方便,所以记录了很多东西,但obsidian是一个本地的文档管理系统,没有部署网页的功能。我考虑到hexo和obsidian使用的都是markdown文档,于是决定写一个文档迁移的脚本,一口气把obsidian下几十篇文档全搬到了网页上。于是工作流就变成了,在obsidian里快乐写文档,写完之后到hexo下一键deploy,网站上就有最新的文档了,真的很舒服。

再之后也看到了别的学长姐的博客,意识到原来还可以记这么多其他东西,和我很不一样。

再往后就遇到了那个她,开始在博客上记录自己那股悸动的感觉,因为这种感觉不记录下来的话,就会溺死在往后的岁月里。当时真的从未想过我们会在一起,我感觉就是一个很特别的我喜欢的女孩子,她肯定有很多爱她的人并不渴求我的爱,毕竟牡丹这么多年了,这恋爱观念的惯性可不小。后来,她也看到了这篇博客,就这样,双向奔赴的我们以这种非常浪漫的方式在一起了。从此博客对我的意义,已经不再是可有可无了,是我的生活了。

近日,整理了一下项目结构,在笔记本上也成功部署了博客网,自此,博客网不再是台式机wsl上的孤品了,我终于有自信在任意电脑上部署网站环境。

没有带来什么

首先,维护本站并没有让我懂得互联网技能,我并没有学会如何布局网页,写css,写js,做前端,后端,网络通讯。首先hexo是一个静态网页,也就是说不涉及后端服务器内容,前端的显示又是由hexo及对应主题负责的,对此我并未过多涉足。我本来更感兴趣的确实是后端内容,但主要是自己也没有组服务器,也没闲钱去租服务器,所以只能暂且罢休。不可否认拥有自己的,前后端齐备的非静态网站是很酷的,心向往之。

我也没有变成技术博客的大佬,我敢说,除了我自己,没有谁能跟着我的技术博客真正做好一个项目。总之我写的不是教程,更像是自己的踩坑记录,但在很多时候这些都很有用(对于我自己)。

带来了什么

熟练辗转于某hub捻取众长,看文档的本事大概是在搭建博客的时候(还有就是整nvim的时候)练起来的,真正把某hub当做了自己的精神故土。接触到了各种各样的,把代码放在互联网上交流协作的人,世界如果少了这个开源社区,那将会是多么闭塞。让我想起来了刘慈欣在《三体》中描绘的,从四维空泡返回三维世界的描述。

在后期,在尝试在博客中记录很多很多非技术的内容,感觉博客里的空气都变得很快活啦哈哈,也是这个时候,真正把这里当成了家,不再只是技术的展牌,同时也是我情感的归宿。懂得了通过记录的方式解决自己的内耗,慢慢地就能够抓住体内游离的情绪,凝练再落笔为文,也很开心自己有了忠实的读者,虽然就一位,但她的意义太特殊了(后面再提吧)。也是这个时候有了读者思维,慢慢的就觉得,用对话的方式展开博客也很有意思。

其实还有很多能说的,比如固化了我使用markdown的偏好等等,但最重要的是,填坑为坦途,这段经历会成为永远的回忆,并指导我在今后的各种或大或小的项目中告诉自己,轻舟总会过万重山的。最后,愿所有的漂流瓶都不会被辜负,海波微兴,浮沉着说不清道不完的宝藏。

2023 Review

点开了好多好多软件的年度报告。惊讶于原来今年是从那个时间点开始的,原来今年发生了这么多的事情。

代码

2023:1054 contributions on github

给现代空战模组进行了阶段性的收尾,工坊订阅人数到达了17k,有很多老外和群外的玩家都非常感兴趣,工坊首页中包含这个mod的载具也越来越多了,很高兴给这么多玩家的飞行载具注入了灵魂。

因为我原本是做木船出身,自然而然得就想着做一个适配二战海战的模组,事实上过程也非常顺利,将整个系统做得非常简明,用过都说好!但由于木船本身就是一个很小的圈子,所以订阅人数不多,刚到1k6。之后又爆肝加上了航母,舰载机系统,至此包含了二战海战中绝大部分的元素。

连续开发完两个mod也意识到玩家往往都会有个性需求,沙盒玩家更是如此,再加上我认为这两个mod有些地方存在共性,所以准备再开一个新坑,往游戏中加入数电的特色,玩家可以通过自己搭配原件来实现自己想要的效果,这样一来,海陆空现代战争的需求就都可以被满足。目前该mod仍然处于起步阶段。

科研

科研,也就那样啦,没发表什么paper,苦力活倒是干了不少。在电院的智能车实验室打杂,从零开发驾驶仿真平台,毕老师手下给ipp复现论文改代码,管理两个机器人小组的项目进度…希望明年能有意思一点(求师兄们捞捞啊)?不过虽说是打杂,倒也是积累了不少经验,譬如很多github的PR,ISSUE的开发习惯都是在电院的组里习得的,再就是也知道了骨骼模型的RNN是怎么一回事,啥是transformer。比起大一大二自己埋头做项目能习得的专项性知识更深入。大概也算是知道了当码仔大概是个什么样的生活(虽然从之前大二实习经历已经可见一斑)。写代码满足别人的需求有时候真的很无语,肯定给自己的idea写代码更有意思。

保研

保研确实是件头痛的事情,说实话我本来对此也没什么紧迫感,毕竟此前的政策一直是过GPA过3.0,保本院在名额上就不会有问题。然后就把被告知今年保研名额对于排名有要求,索性距离不大,努力一下。卷了一个学期成功加了0.15个绩点,保险起见还让毕老师写了一个reference(虽然感觉金力的推荐信也有点像reference)。历经两次meeting,两次小笔试,毕老师给了我一个研究生名额,他可能比较看重我之前做机器人的经验和自学这块的能力,可能还有这股愣头青的冲劲。参加完夏令营之后,就成了毕老师的硕士,他说是会按照博士的标准培养我,但其实我对于他手下硕博培养之间的区别也不慎了解。不过终归是求仁得仁。

恋爱

之前感觉我就是恋爱绝缘体,我知道,智者不入爱河。但就是突然看到永夜的天穹被阳光肆意地撕开了一角,而我也对那缕亮色,着迷了。在遇到gxy前我认为我不是一个会一见钟情的人,但显然我错得离谱。和她的第一次见面,我不敢看她,也不敢和她过多交流,但和她第二次见面的那个下午,基本就奠定,我已经在这场游戏中成为了猎物。我们发展地很快,我无可救药地爱上了这位向我敞开心扉的女孩,并确定了关系,我爱她的不屈,爱她有我没有的东西,爱她对我的包容,也爱上了这种被她喜欢,被她关心,被她倾听的感觉,这是我一直缺少的,但却又一直没意识到的东西。我意识到我已经回不去之前那种虚幻的,自给自足,“我就是我世界里的王”的心境了。恋爱如泡沫般易碎,美梦也会有梦醒的那一天,到时候我又应该如何自处。解决方案很简单,那就是一直一直和她在一起,但谈恋爱本身又是两个人之间的事情,不是我一个人能决定的。gxy真的是一个很好的女孩,但我真的很担心她某一天突然发觉我不是她在感情上需要的那个人,在太多太多事情上我没法给她足够的支持,在太多太多事情上我笨拙到令人发指。这就是一个我这个小男孩在初恋第73天心里会有的迷茫。

CADC Ground Investigation Visual Solution

CADC Ground Investigation Visual Solution

Catalog

Introduce

Motivation

We want to apply computer vision to the plane to fullfill ground investigation task automatically.

Objective

The input image looks like this:
InputImg

And we hope the output prediction to be 56.

Implementation

Environment Preparation

  • python3
  • numpy
  • torch
  • torchvision
  • opencv-python
  • other basic or dependency package

(requirment.txt will be added afterwards)

Foundation

Basic OpenCV methods is required.

Recommended learning site:

Code Review

Source code
in detect.py, there are two large function

1
2
3
4
def detect_target(image):
...
def get_numberShot(img, rect_list, ROI):
...

Function detect_target

Overview

detect_target receive image data(three channels, BGR), detect the colored targets and returns the index of them.

index:

  • rect_list
    • the list whose elements are Box2D type rect, indicating the information of the minimum bounding rectangle
  • ROI
    • the list whose elements are index([x,y,w,h]) of orthogonal bounding rectangle
      MinRect and BoundingBox
      In this picture, the blue frames are the minimum bounding Rectangle and the green ones are ordinary bounding box.

Note: What is Box2D type rect?

index description
rect[0] the location of the box’s center (x,y)
rect[1][0] width of the box(the length of the side which will be first reached by the horizontal line when rotating counter-clockwise)
rect[1][1] height
rect[2] rotation angle

Get the estimated area of the target by color filtering

First we need to convert the color layout from BGR to HSV, which is easier to judge color.

1
image_hsv=cv2.cvtColor(image_cut,cv2.COLOR_BGR2HSV)

Then define a mask that filter the color(hue) range from 160-179 or 0-10 (red),
HSV

1
2
3
4
5
6
7
red1=np.array([0,100,100]) 
red2=np.array([10,255,255])
red3=np.array([160,100,100])
red4=np.array([179,255,255])
mask1=cv2.inRange(image_hsv,red1,red2)
mask2=cv2.inRange(image_hsv,red3,red4)
mask=cv2.bitwise_or(mask1,mask2)

And apply the mask to the picture

1
after_mask=cv2.add(image_cut, np.zeros(np.shape(image_cut), dtype=np.uint8), mask=mask)

after_mask

Turn the after mask image into binary image and adapt close and open processing to fill holes and cancel noise.

1
2
3
kernel=np.ones([3,3],np.uint8)
close=cv2.morphologyEx(binary,cv2.MORPH_CLOSE,kernel,iterations=3)
Open=cv2.morphologyEx(close,cv2.MORPH_OPEN,kernel,iterations=1)

close and open

Then, find the contours of the processed image.

For each contour, adapt filters such as area, the ratio of the height and width of bounding rectangle.

If these restrictions are fullfilled, append the index of bounding rectangle and min area rectangle to two lists respectively, and return the lists.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
contours, hier=cv2.findContours(Open,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
res_img=image.copy()
ROI=[]
rect_list=[]
for i in range(len(contours)):
if cv2.contourArea(contours[i])<100:
continue
epsl=0.01*cv2.arcLength(contours[i],True)
approx=cv2.approxPolyDP(contours[i],epsl,True)
x,y,w,h=cv2.boundingRect(approx)
if (float(w/h)<2) and (float(w/h)>0.5):
res_img=cv2.rectangle(res_img,(x,y),(x+w,y+h),(0,255,0),1)
ROI.append([x,y,w,h])
rect = cv2.minAreaRect(approx)
box = cv2.boxPoints(rect)
box = np.int0(box)
rect_list.append(rect)
res_img=cv2.drawContours(res_img, [box], 0, (255, 0, 0), 2)
cv2.imshow('res_img',res_img)
return rect_list,ROI
How I set up my blog site

How I set up my blog site

This post record the steps I set up this blog site.

Catalog

Env preparation

Installation

Use following command to confirm:

1
2
3
$ node -v
$ npm -v
$ git --version

Github

Connection

Create and copy SSH key:

1
2
3
$ ssh-keygen -t rsa -C "GitHub email"
$ cd ~/.ssh
$ vim id_rsa.pub

Copy the contents

Go to Github -> Settings and Add SSH key

Confirm the connection:

1
$ ssh -T git@github.com

Setup Github Pages repository

Create Username.github.io(your URL)

Install Hexo

1
$ npm install -g hexo-cli

Setup a local workspace:

1
2
3
$ git init
$ hexo init
$ npm install

launch local server:

1
2
3
$ hexo cl
$ hexo g
$ hexo s

or use following command to specify port:

1
$ hexo server -p 5000

visit http://localhost:4000

Deploy to Github server

Install hexo-developer-git:

1
$ npm install hexo-deployer-git --save

edit _config file’s Deployment part:

1
2
3
4
deploy:
type: git
repository: git@github.com:Chen-Yulin/Chen-Yulin.github.io.git
branch: master

then run in bash:

1
$ hexo d