广州的天气
发布时间:2024-08-26 08:54:42
归档分类:

六月份的时候在广州谋求了一份工作,公司不是很大,但氛围还挺好的,就是有些在学校实验室的感觉,幸得除我之外还有另一位实习同事,他是研究生毕业的,所学的是测绘,公司的主营业务也正是这一方向,而我则是以实习软件工程师的身份入职。

入职的时候也正是暑假开始,以往的暑假我都在家里晃晃度日,从小学到大学毕业,十多年的时间,眨眼就要工作了,时间就像是加速了一样,我现在仍能回想起小学的时候和小区里的好朋友一起玩泥巴过家家的场景,如今则真的要像一个成年人那样去自己生活了,即感慨又缅怀。说起家,我的恋家情绪其实并不严重,因为大学是从广西到哈尔滨上学,离家远,所以平时的短假是不够时间回家的,四年里也习惯了这种离家的感觉,加之现在有视频聊天,怎么样都不会太过恋家的。

入职的时候在广州这边的城中村租了一个小单间,房价 900 多一个月,但主要是水电好贵(水 5元/吨 · 电 1.5元/度), 以后有钱要狠狠搬家,现在做饭都很困难,因为没有厨房,可惜我的寒暑假磨练的厨艺了,并且今日去外面吃了青椒炒肉,居然和我水平一样,离谱的是要 19 块,当真是不便宜呢。


前段时间广州受到了季风气候的影响,下了一个星期的雨,感觉房间和衣服都霉臭霉臭的,并且阴天笼罩着使得每个人感觉都很不开心,那段时间也是我工作极为不顺的日子,但索性也都撑过来了,但还是有些后怕的,当然并非是工作方面的,而是生活!比如我的内裤和袜子在那段时间里就几乎就没有干过,要不是我带来广州的内裤和袜子多,还真的连门都出不了,所有感觉买一个烘干机还是很有必要的,回南天我想它必能发挥无比大的用处。所以也在想要不要买些一次性袜子和内裤作为应急之物,省得下雨回南时湿漉漉的,发霉到了极致,长小蘑菇可就不雅了。

说起应急之物,储备些药物似乎很有必要呢。

药物

1. 外伤

小型的擦伤创可贴+碘伏似乎就能搞定,更严重的伤口想必还是得去看医生,所以买一盒创可贴、棉签、碘伏

2. 退烧止疼药

毕竟是从新冠时代过来的,发烧止疼用「对乙酰氨基酚」和「布洛芬」我想就足够了,另外加一只体温计。

3. 病毒性感冒

这个似乎无药可治,还是以预防为主吧,前段时间还听说新冠又在广州蔓延,早上挤地铁时还看到有人戴 N95 口罩呢,事情的真假不得而知,总之戴口罩还是没有错的,避免病毒传播。所以,买些口罩在地铁的时候戴戴。

感冒按照以往的经验,不发烧即意味着一个星期便好,只不过中间很难受,发烧则可以尝试一下退烧药,若是反复烧则去医院抽血检查一下,想必是病毒太猛了,抽血针对性杀掉它们。

  • 生活
  • RTCM 1005 解析
    发布时间:2024-07-19 13:02:26
    归档分类:

    前言

    RTCM 是一种普遍采用的数据传输格式,它是由国际海运事业无线电技术委员会提出的,用于制定在差分全球导航定位系统和实时动态操作时使用的标准。

    下面是技术规范文档:

    第一个文档是官方的,包含了很多的细节,但是需要付费,虽说有其他方式获得,但版权原因还是不在此贴出;

    第二个文档是北云科技的,中文文档虽说少了一些细节,但终究方便阅读,虽然本文不会参考它 :)

    文档解读

    RTK的消息类型有很多,初看会很懵,但在只要找到自己想要了解的消息类型即可,在文档的 3.2 节 Message Type Summary 中有详细的介绍,本文主要关注 1005 这个消息类型,它由 19 个字节也就是 152 个比特构成,它主要包含基准站位置数据信息,也就是基站的 ECEF 的坐标。

    Screenshot from 2024-08-05 09-41-51.png

    在正式阅读之前,还需要了解一下数据结构和类型,在文档的 3.3节 Data Types 有详细的介绍:

    数据类型很好理解,它规定了数据的范围和构成,后面写程序做转换的时候要严格按照本节的数据结构来实现。

    image.png

    下面是这个协议具体的内容, 后面会详细分析:

    image.png


    解算

    下面给出一段 RTCM 1005 的原始码流,它是十六进制的 ASCII :

    D3 00 13 3E D7 D3 02 02 98 0E DE EF 34 B4 BD 62 AC 09 41 98 6F 33 36 0B 98
    

    在手动计算之前,还需要了解一下它在传输时候的格式,RTCM 数据以帧的形式的传输

    image.png

    • Preamble : 同步码(8 bits) , 11010011 ,其十六进制为 'D3'
    • Reserved : 保留(6 bits),000000,十六进制为 00
    • Message Length: 长度(10 bits),数据信息的长度,以字节数表示
    • Variable Length Data Message(0-1023 bytes): 可变长数据消息,长度不定,最大 1023 bytes
    • CRC:校验(24 bits)

    所以 RCTM 1005 每帧大致长这样: 1101 0011 0000 00 + 长度 + 数据 + 校验

    开头固定为 : 1101 0011 0000 00 ,十六进制就是 D30 ,我们再回头看一下原始码流:

    D3 00 13 3E D7 D3 02 02 98 0E DE EF 34 B4 BD 62 AC 09 41 98 6F 33 36 0B 98
    

    前三个十六进制 ASCII 码 我们就能解析出来了,后面紧跟着的是消息长度,它使用 10 个 bit 存储

    Hex: D3 00 13
    Binary: 1101 0011 0000 0000 0001 0011
    

    所以,同步码 + 保留 + 长度 总共就用了 24 个 bit ,也就是 3 个字节

    接下来就是可变长度的数据消息了,下面的表格就是 1005 类型的数据内容:

    DATA FIELD                                  DF NUMBER   DATA TYPE   NO. OF BITS
    -------------------------------------------------------------------------------
    Message Number ("1005"=0011 1110 1101)      DF002       uint12      12
    Reference Station ID                        DF003       uint12      12
    Reserved for ITRF Realization Year          DF021       uint6       6
    GPS Indicator                               DF022       bit(1)      1
    GLONASS Indicator                           DF023       bit(1)      1
    Reserved for Galileo Indicator              DF024       bit(1)      1
    Reference-Station Indicator                 DF141       bit(1)      1
    Antenna Reference Point ECEF-X              DF025       int38       38
    Single Receiver Oscillator Indicator        DF142       bit(1)      1
    Reserved                                    DF001       bit(1)      1
    Antenna Reference Point ECEF-Y              DF026       int38       38
    Quarter Cycle Indicator                     DF364       bit(2)      2
    Antenna Reference Point ECEF-Z              DF027       int38       38
    -------------------------------------------------------------------------------
    TOTAL                                                               152
    

    Message Number ("1005"=0011 1110 1101)

    它的长度 12 个比特,也就是 3 个 Hex Ascii 码:

    Hex: 3E D
    Bin: 0011 1110 1101
    Dec: 1005
    

    将十六进制的 3ED Ascii 码转换为 十进制的数字,我们可以看到它正好是 1005

    Reference Station ID

    Hex: 7 D3
    Bin: 0111 1101 0011
    Dec: 2003
    

    Reserved for ITRF Realization Year

    Hex:02 02 Bin:0000 001 00000 0010(取前 6 位 ,也就是 0000 00 = 0)

    GPS Indicator

    Hex: 02 02

    Bin:0000 00**1 **00000 0010 (取第 7 位 ,也就是 1)

    GLONASS Indicator

    Hex: 02 02

    Bin:0000 0010 0000 0010 (取第 8 位 ,也就是 0)

    Reserved for Galileo Indicator

    Hex: 02 02

    Bin:0000 0010 0000 0010 (取第 9 位 ,也就是 0)

    Reference-Station Indicator

    Hex: 02 02

    Bin:0000 0010 0000 0010 (取第 10 位 ,也就是 0)

    Antenna Reference Point ECEF-X

    它的长度是 38 bits

    Hex: 02 98 0E DE EF

    Bin: 0000 0010 1001 1000 0000 1110 1101 1110 1110 1111

    Dec: 11141045999

    Single Receiver Oscillator Indicator

    Hex: 34

    Bin: 0011 0100 (取第 1 位, 也就是0)

    Reserved

    Hex: 34

    Bin: 0011 0100 (取第 2 位, 也就是0)

    Antenna Reference Point ECEF-Y

    它的长度是 38 bits

    Hex: 34 B4 BD 62 AC

    Bin: 0011 0100 1011 0100 1011 1101 0110 0010 1010 1100

    二进制最高位是 1 ,为负数,所以要取反再加1

    补码: 10 1011 0100 1011 0100 0010 1001 1101 0101 0100

    除去第一位的符号位,后面加粗的就是实际的数值

    Bin: 0 1011 0100 1011 0100 0010 1001 1101 0101 0100

    Hex: 4B 4B 42 9D 54

    Dec: 48507297108

    加上符号位就是 -48507297108

    Quarter Cycle Indicator

    Hex: 09

    Bin: 00 00 1001(取前两位, 也就是 00)

    Antenna Reference Point ECEF-Z

    Hex : 09 41 98 6F 33

    Bin: 0000 1001 0100 0001 1001 1000 0110 1111 0011 0011

    Dec: 39755214643


    到此为止,手动结算就已完成,若是关注 ECEF XYZ 的取值,则需要回看数据类型,它们的数据类型是 DF025、DF026、DF027

    image.png

    这张图详细地说明了 ECEF XYZ 的数据类型,数据范围,数据处理

    其中,它是 int38 的有符号38位整数,数据是 0.0001 m

    上面我们算得的数,都应做一个处理:

    ECEF-X : 11141045999 * 0.0001 = 1114104.5999m

    ECEF-Y: 48507297108*0.0001= -4850729.7108m

    ECEF-Z:39755214643*0.0001 = 3975521.4643m

    (完)

  • RTCM 1005
  • 地理坐标转换
    发布时间:2024-06-29 07:07:00
    归档分类:

    近些日子的工作频繁接触到了大地测量中的各种知识,在编写程序的时候更是涉及各种地理坐标的转换,虽然没有深入去学习其核心的变化原理,但是简单地使用现存的公式配合程序进行计算还是可以做到的,以下是有关知识的记录。

    1.名词解释

    1.1 LLA 坐标系

    LLA 坐标是地理坐标系中的一种表示方法,LLA 代表经纬度和高度(Latitude, Longitude, and Altitude),它通常用于描述地球表面上的位置。

    • Latitude (纬度):表示从地球赤道向北或向南的角度,范围是 -90° 到 +90°。正值表示北纬,负值表示南纬。
    • Longitude (经度):表示从本初子午线(通常是通过格林尼治的子午线)向东或向西的角度,范围是 -180° 到 +180°。正值表示东经,负值表示西经。
    • Altitude (高度):表示相对于平均海平面的高度,可以是正值(高于海平面)或负值(低于海平面)。

    LLA 坐标系也叫全球地理坐标系、大地坐标系、WGS-84坐标系。纬度和经度的数值可以以多种不同的单位或格式出现:

    • 六十进制度:度、分、秒:40° 26′ 46“ N 79° 58′ 56” W
    • 度和十进制分:40° 26.767′ N 79° 58.933′ W
    • 十进制度: +40.446 -79.982

    横纬竖经,在计算的过程中,主要也是将之转换为十进制来计算的,以下是计算公式: $$ decimal = degress + \frac{minutes}{60} + \frac{seconds}{3600} $$

    关于 WGS-84 ( World Geodetic System 1984,1984年世界大地测量系统),它是目前全球范围内使用最广泛的地理坐标系统和地球模型,由美国国防部制定和维护,主要用于全球定位系统(GPS)和各种地理信息系统(GIS)。

    WGS-84 有几个关键常量用于定义参考椭球体的形状和尺寸,这些常量包括半长轴、半短轴、扁率和离心率等:

    • 半长轴 (A):椭球体的赤道半径
      • 其值为 $ 6378137.0 $ 米。
    • 半短轴 (B):椭球体的极半径
      • 其计算公式为: $ B = A*(1-F) $
      • 其值为 $ 6356752.3142 $ 米
    • 扁率 (F):描述椭球体扁平程度的参数
      • 其计算公式为:$ F = \frac{A-B}{A}$
      • 其值为:1/298.257223563
    • 第一离心率 (E):描述椭球体形状的一种参数,反映了椭球体的偏离程度
      • 其计算公式:$ E = \sqrt{1 - (\frac{B}{A}) ^2} $
      • 其值约为: 0.0818191908426
    • 第一离心率的平方 (E²):减少计算所用
      • 其中值约为: 0.00669437999014

    1.2 ECEF坐标系

    ECEF(Earth-Centered, Earth-Fixed)坐标系是一种三维笛卡尔坐标系,用于表示地球上的位置。ECEF 坐标系也称为地心地固坐标系,它的原点位于地球质心,并且随着地球的自转而旋转。

    • X 轴:指向穿过地球赤道与本初子午线(通过格林尼治的子午线)交点的方向。
    • Y 轴:指向穿过地球赤道与东经90度子午线交点的方向。
    • Z 轴:指向北极方向,与地球自转轴一致。

    ECEF 坐标系提供了一个统一的三维坐标框架,可以精确地表示地球表面和近地空间的任何位置。

    1.3 ENU坐标系

    ENU(East-North-Up)坐标系是一种局部笛卡尔坐标系,用于表示相对于某个参考点的三维位置。

    • ENU 坐标系的原点通常位于地球表面的某个参考点,该点的地理坐标为 (Latitude, Longitude, Altitude)。
    • E 轴(东向轴):指向地平线的东方。
    • N 轴(北向轴):指向地平线的北方。
    • U 轴(上向轴):垂直向上,指向天空。

    2. 坐标系转换

    2.1 从 LLA 坐标到 ECEF 坐标

    这里约定LLA的经度为 $\phi$,纬度为 $\lambda $,海拔为 $ h $, 选取 WGS-84 坐标系参数,$a$和$b$分别是是赤道半径(半长轴)和极半径(半短轴),$e^2 = 1 - \frac{b^2}{a^2}$是偏心率的平方, $f=1-\frac{b}{a} $ 是基准椭球体的极扁率。 $$ \begin{align} X& = (N(\phi) + h) cos \phi cos\lambda \\ Y& = (N(\phi) + h) cos \phi sin\lambda \\ Z& = (\frac{b^2}{a^2}N(\phi) + h)sin\phi \\ &=((1-e^2)N(\phi) +h)sin\phi \\ &=((1-f)^2N(\phi)+h)sin\phi \end{align} $$ 其中 $$ \begin{align} N(\phi) = \frac{a^2}{\sqrt{a^2cos^2\phi + b^2sin^2\phi}} = \frac{a}{\sqrt{1-e^2sin^2\phi}} \end{align} $$

    2.2 从 ECEF 到 LLA坐标

    将 ECEF 坐标 (X, Y, Z) 转换为经纬度和高度 (Latitude, Longitude, Altitude) 需要迭代计算。 $$ \begin{align} \lambda = atan2(Y,X) \end{align} $$

    其中,atan2 是反正切函数

    $\lambda$ 是唯一能直接算出的,其余的纬度和高度的转换所要涉及 N 的循环关系 $$ \begin{align} \frac{Z}{p}cot\phi = 1 - \frac{e^2N}{N+h} \\ h = \frac{p}{cos\phi} -N \end{align} $$ 其中,如公式$(6)$所示,N 的变化取决于 $\phi$ 的值

    纬度和高度需要迭代求解, 例如,从第一个猜测 h≈0 开始,然后更新 N。

    其流程是这样的:

    1. 猜测 h = 0,通过公式$(8) $ 可以推算 $cot\phi = \frac{(1-e^2)p}{Z} $ 求解出一个$\phi_1$
    2. 将 $\phi_1$ 带入公式 $(6)$,求解出 $N$
    3. 将 $N$ 带入公式$(9)$ 求解出 $h$
    4. 将 $h$ 带入公式$(8)$ 求解出一个新的 $\phi_2$
    5. 如果 $\phi_1$和$\phi_2$足够接近,则说明迭代出了一个正确的值,如果不是,则需要回到第2步继续迭代。

    2.3 从 ECEF 到 ENU 坐标

    ENU 坐标又称为站心坐标,6也就是局部坐标,这个坐标需要一个局部参考点。在实际例子中,这个参考点通常是雷达、基站这些地方。

    如果基站位于 ${X_0,Y_0,Z_0}$,测站位于 ${X_1,Y_1,Z_1}$

    $$ \begin{bmatrix} e\\ n\\ u \end{bmatrix}= \begin{bmatrix} -sin\lambda_0& cos\lambda_0 & 0\\ -sin\phi_0cos\lambda_0& -sin\phi_0sin\lambda_0 &cos\phi_0 \\ cos\phi_0cos\lambda_0& cos\phi_0sin\lambda_0 & sin\phi_0 \end{bmatrix} \begin{bmatrix} X_1 -X_0\\ Y_1-Y_0\\ Z_1-Z_0 \end{bmatrix} $$

    (完)

  • 地理
  • Geo
  • LLA
  • ECEF
  • ENU
  • 胶片图集 (一)
    发布时间:2024-03-13 05:08:23
    归档分类:

    许久没有写一些博文了,请原谅我,因为生活比较单调,加上最近有一些抑郁的情绪,目前仍然在调整当中。虽然生活千篇一律,但是偶尔也是有出去晒太阳的,也是有好好生活的。

    我最近拍了很多的胶片,于是打算放到这里来,让大家看看~

    正文

    这是一个用半幅胶片机拍摄的,黑白的负片,加上半格画幅带来的画质损失,使得这幅照片拥有一种恰到好处的感觉。拍摄的时间是哈尔滨的冬季,可以看到路上都是雪,周围的树木也光秃秃的,黑白拍摄树枝有时候会很杂乱,但是这幅照片倒还好。

    这张照片是我的第一卷胶片,当时买了 Canon Demi 初代半格相机,寻思着玩一玩吧,结果一发不可收拾!拿着这台相机在学校到处拍摄,从那时候开始,我彻底爱上了胶片。胶片是一种延迟的体验,一卷胶卷大约能拍32张,而半格则更多了(画幅相对于135mm裁切了一半),也就是需要拍满72张才能取下胶卷,而且拍完无法立即查看,需要送给冲洗店老板冲扫,这又往往还需等待一个礼拜的时间。

    通过胶片,我记录下的照片常常成为我生活的缩影,它介于严肃与不严肃之间,而其本身的质感往往让人感到温暖和怀旧,我后面又陆陆续续买了 佳能 QL17 旁轴、佳能 kiss 1单反、佳能 eos55 单反等,就我而言,单反相对更加容易掌控,其功能与镜头的选择也更加丰富。

    与现代相机一样,胶片相机也需要在拍摄时选择光圈,需要权衡景深的大小,而慢速快门则要考虑画面是否会受到抖动的影响,不同的是一旦按下快门则无法修改,一张底片就此定格。


    下面这张图的猫猫很可爱的,当时我走过去的时候它主动地帖帖我了,或许是想要我给他挠痒,围着我走了一圈,然后贴在我的鞋边!我怎么能抗拒得了这样的诱惑呢!我充分地挠了挠它的猫猫头后,它也享受地走开了,之后我便去其他地方了,再回来就看到它在边躲太阳边休息。

    于是我立马掏出了相机,幸好我有 28-105 的变焦镜头,不用靠得特别近也能拍摄。虽说猫猫看起来很可爱,但它们可听不懂我们人类的话,靠得太近了,惹恼了它可就不愉快了,索性就在不远处保持着距离拍摄。


    小灯笼和小狮子

    虚化带来的好处就是主体很清晰,消除背景细节,可以营造出更为干净、简洁的画面


    这张是在龙母庙拍的,主要是测试一下我新买的镜头 40mm 2.8 光圈全开的虚化效果 。


    这张是半格机拍的, ILFORD PAN 100 好歹也是 100 感光度的胶卷了,但是拍出来还是出现了很明显的颗粒。难道半格相机还得使用 ISO 50 的 5203 拍摄会比较好吗?但是这又出现了一个问题,demi是估焦的,拍摄近物时,往往需要缩小光圈以达到超焦距的效果,然而使用 50 ISO后,便不太能使用小光圈了,因为这可能会导致画面抖动或者欠曝,真是难以抉择呢。


    接下来的这三张,是我家城市的骑楼城,梧州的河东许多的老建筑特别有历史的底蕴,我很喜欢在这里拍摄黑白的照片,当然彩色的照片也非常好看,有一种不一样的质感。


    这张图我觉得很棒噢,当时很顺利地抓拍了,其实等车再开过去一些些会好很多呢。


    最后想说的是,我最近有在尝试自己冲洗黑白胶卷噢,听起来是挺复杂的,但是实际做起来非常的简单,而且特别有成就感,但就不在这篇文章叙述多言了,之后会再写一篇的。

    (完)

  • 胶片
  • 新年快乐
    发布时间:2024-02-09 12:27:13
    归档分类:

    新的一年又到啦,马上就毕业了!大学四年飞快地度过。

    rustic-page 项目很久没有提交新的代码了,过段时间会提交一些新的功能代码,这个项目我想着尽量不去反复地重构。

  • post
  • 九月与十月
    发布时间:2023-10-12 06:33:02
    归档分类:

    这个月继续完善 rustic-pages ,这个项目是八月的时候发起的,十月我对它进行了一次重构,目前已经基本完成,代码并没有进行什么模块的拆分,因为我还没完全吃透 rust ,随意套用一些模式会出现意想不到的问题。

    因为 rust 的特性,引用借用这些很严格,所以在 0.1.4 以前的版本中,我并没有使用生命周期,所以这不可避免得导致了解析和生成的缓慢,但这仍然是可以接受的。在重构之前,我对 rust 的生命周期理解得还不充分,在拆分模块之后,代码几乎无法正确运行,同时依赖的包也无法自动解析这类的引用类型,我想我在学习 rust 的时候必然是缺失了一些知识,我对数据类型的了解还不够充分。

    但是这是一个长期的项目,文档编写的工作也十分繁琐,前期的需求文档已经不足以支持我继续开发了,很多新的特性也在我脑子里蹦出来,我需要更多的时间去完成这些工作。但是目前的我最缺少的就是时间,我仍在准备研究生考试,加之我最近打算弄一个软件著作,时间上总是有些不够呢。


    不同于之前的观念,维护一个项目是有趣的,将脑海里的新特性实现于代码之中,这确实很有成就感。

    当然了,其实我应该多加入一些方便用户使用的脚本或者功能,事实上,目前的版本只能是将 sources 里的 markdown 源文件渲染到 public 里,但是没有实现类似与 Hexo 中的 deploy 指令,这涉及到一些 git 操作,我目前还是不太了解,虽然我在我自己博客中实现了这一脚本,但是我不确定如果这个脚本在其他电脑中会出现些什么。

    #!/bin/bash
    
    current_datetime=$(date +"%Y-%m-%d %H:%M:%S")
    TEMP_DIR=$(mktemp -d)
    cp -r public/* "$TEMP_DIR"
    cd "$TEMP_DIR"
    git init
    
    git add .
    git commit -m "Update: $current_datetime"
    git remote add origin "[email protected]:fengyarnom/fengyarnom.github.io.git"
    git push -f origin "master:gh-pages"
    # 清理临时目录
    cd ..
    rm -rf "$TEMP_DIR"
    
    
  • 思考
  • Rustic-pages 需求与开发文档
    发布时间:2023-08-31 12:36:47
    归档分类:

    1. 引言

    要求使用 Rust 编写一个高效且易于使用的静态博客生成器,它将能正确处理 Markdown 和 SCSS 文件的文件。

    它将支持以下命令行指令:

    • init: 初始化程序,创建相应文件夹及内容

    • generate : 渲染和生成所有的静态网站内容

    • clean : 清除缓存

    • server : 本地部署服务,该指令应该默认调用 cleangenerate

    • deploy : 自动部署静态文件到指定仓库

    所有的内容应该均以变量的形式预先准备,然后再根据规则渲染文件。

    2. 功能需求

    2.1 博文编辑

    • 用户可以创建、编辑和删除博文。
    • 博文内容支持 Markdown 格式,允许用户使用 Markdown 语法编写博文。
    • 用户可以设置博文的标题、发布日期、标签和归档。
    • 用户可以上传图片和附件,并在博文中引用它们。
    • 用户可以保存博文为草稿,随时继续编辑。

    2.2 博文生成

    • 用户可以使用命令行工具生成静态网站。
    • 博客生成器将从用户指定的目录中读取博文和资源文件,并生成静态 HTML 文件。
    • 用户可以指定生成的网站目标路径。
    • 生成的网站应包括主页、博文详细页、归档页、分类页面和标签页面。

    2.3 主题和样式

    • 用户可以选择不同的博客主题和样式。
    • 博客生成器应支持多个默认主题,用户也可以自定义主题。
    • 用户可以自定义网站的样式表(CSS)。

    3. 功能模块

    3.1 数据结构

    3.1.1 Post

    • title: String

    • date: String

    • date_simple : String

    • published: bool

    • tags: Vec

    • categories: Vec

    • raw_content: String

    • content: String

    • slug: String

    • link: String

    3.1.2 Page

    • title: String,

    • date: String,

    • template: String,

    • raw_content: String,

    • content: String,

    • limited_cows:usize,

    • total: usize,

    • current: usize,

    • prev:usize,

    • prev_link: String,

    • next:usize,

    • next_link: String

    3.1.3 Archive

    • posts - Vec
    • pages: Vec
    • tags: HashMap<String,Vec<& Post>>
    • categories: HashMap<String,Vec<& Post>>

    3.1.4 Config

    pass

    3.2 构建逻辑(Generate)

    1. 程序首先构造一个 Archive 实例,用于保存接下来所有的变量数据。

    2. Post 处理过程

      1. 从 /source/content/posts 中获取所有的 markdown 文件,并进行解析,封装为一个可操作的 Post 数据实例。
      2. 所有的Post 插入到 Archive.posts
    3. Tag 处理过程

      1. 遍历 Archive.posts 将每个Post 内的 Tag 解析
      2. 所有的 Tag 插入到 Archive.tags
    4. Category 处理过程

      1. 遍历 Archive.posts 将每个Post 内的 Category 解析
      2. 所有的 Category 插入到 Archive.categories
    5. 页面构造逻辑

      1. 从 /source/content/pages 中获取所有的 markdown 文件,进行解析,封装为一个可操作的 Page 数据实例
      2. 所有的 Page 插入到 Archive.pages
      3. 若是front-matter 带有 pagination: tags,则对 Archive.tags 触发分页
      4. 若是front-matter 带有 template: xxx ,则渲染模板,否则默认输出 content

    3.3 路径渲染逻辑

    • Index - Page
      • /public/index.html
      • /public/page/N/index.html
    • Archive
      • /public/archive/posts/2023/12/10/hello/index.html
      • /public/archive/tags/技术/index.html
      • /public/archive/categories/算法/index.html
    • Tags - Page
      • /public/tags/index.html
      • /public/tags/page/N/index.html
    • Categories - Page
      • /public/categories/index.html
      • /public/categories/page/N/index.html
    • Custom Page
      • /public/custom/index.html
      • /public/custom/page/N/index.html

    README 文档

    A lightweight static blog generator developed using Rust

    Usage

    You can compile the source code of this project using the cargo build command.

    cargo build
    

    When you run cargo build, it searches for the Cargo.toml file in the current directory and builds the project based on the configuration information specified in that file. Cargo.toml is the configuration file for Rust projects and contains the project's dependencies and other build configurations.

  • rustic-pages
  • 需求文档
  • 我的静态博客生成器
    发布时间:2023-08-27 09:22:56
    归档分类:

    近些日子无心向学,于是又手痒折腾起了代码。

    起因是接触到了 Rust 这门语言,并了解到了它的很多特性。我认为这真的是一个很棒的语言并且惊叹于它的性能。正因如此,我决定以此为契机,开始了一个新的项目,一个使用 Rust 编写的静态博客生成器。

    项目情况

    目前它只是一个堪堪能用的状态,我甚至还没想好它的名字,现在只是使用 static-blog-rust-make 作为项目名字,我并没有想出一个正式的名字。我目前开源在Github 上,由于时间实在是不够用,我在有限的时间内已经做到了极限,优化代码和新功能的添加只能在日后完成了,但是,我仍然十分满意于这个项目!

    虽然如此,这个生成器确实已经可以正常使用。我用它来重新生成了一个这个网站,并将之前为 Hexo 写的主题应用其中。目前的版本是 v0.03 。项目仅仅是一个粗劣地模仿 Hexo 的产物,并没有融入很多我的思考,很多核心功能也只是调用别人写好的包,但是这次的代码仍然给我很多地启示,我发觉我开始接触到了很多软件工程的内容,同时对一个项目的整体规划有了一些了解。总之,这一次的项目开发还是很有意思的,之后的一段时间会着手于新的开发文档,并希望能在书写开发文档的过程中,思考更多新的功能。

    最后,这是一个非常不完美的项目,里面的代码混乱不堪,复杂的逻辑结构几乎把我压倒。在多次重构和清理冗杂代码后,确实完成了我一开始定下的所有功能需求,但是这样的代码总归让人看了倒胃口,但也只能在之后的日子里慢慢修改完善啦,至少它没有夭折在漫长的开发期中。我确实是以最快的速度开发的,为的就是减少枯燥,目前看来确实如此,我在耐心消耗殆尽前完成了这个项目。

  • 开发日志