N4HGl7+d+nG2txgCLDIW?&SrhL>SY8m>x*BvE
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
G&Hn-0sxHC+
literal 0
HcmV?d00001
diff --git a/简介.md b/简介.md
index 7665728..f49d246 100644
--- a/简介.md
+++ b/简介.md
@@ -1,4 +1,5 @@
# HDU计算机科学讲义
+
## 序言
相信看到这个wiki的同学都对计算机专业有着或多或少的期待,或许有人因小时候某次电视上的黑客操作所振奋,或许有人是被全民编程的时代浪潮席卷而来,渴望着高薪的工作,或者又有人因为渴望着用编程改变世界。
@@ -13,7 +14,7 @@
学长学姐们深知其中痛楚,在我们踩了一个个坑后,我们决定:
-**出一份计算机科学领域的讲义,一起做大家的领路人。**
+**出一份计算机科学领域的讲义,一起做大家的领路人。**
## 救赎之路?
@@ -38,7 +39,8 @@
**群号:669895692**
::: tip 🤔
-#### **为什么我要花大量的时间与折磨受这样的训练?**
+
+### 为什么我要花大量的时间与折磨受这样的训练?
因为你来大学的主要目的,就是进行学习,而学校的传授的内容往往是不能满足成为一个合格的 CSer 的全部需求的。
@@ -49,6 +51,7 @@
教育除了知识的记忆之外, 更本质的是能力的训练, 即所谓的 training。 而但凡 training 就必须克服一定的难度, 否则你就是在做重复劳动, 能力也不会有改变。 如果遇到难度就选择退缩, 或者让别人来替你克服本该由你自己克服的难度, 等于是自动放弃了获得 training 的机会, 而这其实是大学专业教育最宝贵的部分。 —— etone
:::
+
## 学习原则
1. 建议保持至少一半时间在实操,一半时间在学理论知识,比例未必正确的,但是强调实操和反馈的重要性,如果你上来就拿一本经典的花书看,只看理论或者上来就整一段开源代码,势必会陷入不同程度的盲目和困苦当中。
From 01251fa04c0c73d1d3e027851def28e49e197129 Mon Sep 17 00:00:00 2001
From: camera-2018 <2907618001@qq.com>
Date: Wed, 19 Jul 2023 17:36:54 +0800
Subject: [PATCH 04/25] fix: no space at build
---
components/Parallax.vue | 2 +-
.../{hdu-cs-wiki main.png => hdu-cs-wiki_main.png} | Bin
2 files changed, 1 insertion(+), 1 deletion(-)
rename public/{hdu-cs-wiki main.png => hdu-cs-wiki_main.png} (100%)
diff --git a/components/Parallax.vue b/components/Parallax.vue
index 2bc9f48..e9315d7 100644
--- a/components/Parallax.vue
+++ b/components/Parallax.vue
@@ -93,7 +93,7 @@ export default {
diff --git a/public/hdu-cs-wiki main.png b/public/hdu-cs-wiki_main.png
similarity index 100%
rename from public/hdu-cs-wiki main.png
rename to public/hdu-cs-wiki_main.png
From 1145c0491bd6f5094259a6db1848546cadc88ec2 Mon Sep 17 00:00:00 2001
From: wenjing233 <47737760+wenjing233@users.noreply.github.com>
Date: Wed, 19 Jul 2023 20:17:40 +0800
Subject: [PATCH 05/25] =?UTF-8?q?Update=203.2.1=E4=B8=BA=E4=BB=80=E4=B9=88?=
=?UTF-8?q?=E8=A6=81=E9=80=89=E6=8B=A9ACM=E2=80=94=E2=80=94=E8=B0=88?=
=?UTF-8?q?=E8=B0=88=E6=88=91=E4=B8=8EACM.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
根据第一手消息进行相关更新
---
.../3.2.1为什么要选择ACM——谈谈我与ACM.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/3.编程思维体系构建/3.2.1为什么要选择ACM——谈谈我与ACM.md b/3.编程思维体系构建/3.2.1为什么要选择ACM——谈谈我与ACM.md
index d95f55f..455ba8b 100644
--- a/3.编程思维体系构建/3.2.1为什么要选择ACM——谈谈我与ACM.md
+++ b/3.编程思维体系构建/3.2.1为什么要选择ACM——谈谈我与ACM.md
@@ -36,6 +36,8 @@ author:wenjing
③ 在初高中参加竞赛的学生的数量和质量有极可能已经有所下降,因为竞赛相关政策的紧缩,稀烂的强基计划替代了对竞赛友好的自主招生,选择全力投身竞赛,拼搏省队的学生有所下降,有基础的学生现在也不见得很强。
+UPD at 2023/7/19:从长期来看,这个结论应该是没有错的,但是很可惜,如果您是2023届的新生,您将遭遇紧缩政策下一波不得不来hdu的竞赛高材生,截至笔者更新为止,已经有五位NOI银牌选手和两位具备NOI银牌能力的选手提前加入了集训队,也许对于零基础的同学而言,仍然只要和别的零基础同学竞争保底的三个席位就好了。但从长远来看,进队不是结束,抢夺比赛机会才是开始。而且如果hdu能抢到这样的生源,其他学校的水平大概率也会上涨,就算有了比赛机会也很难说会不会拿铜遗憾结尾。如果您出于好奇,想了解这荒谬的景象是如何诞生,请参阅电子书[《整型溢出》](https://zhuanlan.zhihu.com/p/117660874)
+
进队的学生零基础偏少,如果你选择这条路你可能需要克服不小的困难
# 我应该以什么态度学习 ACM?
From c9930ebfcb719df815133ae9ad6af70de9b8eaf1 Mon Sep 17 00:00:00 2001
From: unknown <2239888030@qq.com>
Date: Wed, 19 Jul 2023 20:23:54 +0800
Subject: [PATCH 06/25] =?UTF-8?q?update:=20=E8=AE=A1=E7=AE=97=E6=9C=BA?=
=?UTF-8?q?=E5=AE=89=E5=85=A8=E2=80=94=E2=80=94=E5=9F=BA=E7=A1=80=E5=B7=A5?=
=?UTF-8?q?=E5=85=B7=E4=BD=BF=E7=94=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../6.2.1基础工具的使用.md | 302 +++++++++++++++++-
1 file changed, 296 insertions(+), 6 deletions(-)
diff --git a/6.计算机安全/6.2.1基础工具的使用.md b/6.计算机安全/6.2.1基础工具的使用.md
index 0524324..28f87bd 100644
--- a/6.计算机安全/6.2.1基础工具的使用.md
+++ b/6.计算机安全/6.2.1基础工具的使用.md
@@ -1,12 +1,302 @@
# 基础工具的使用
-# IDA pro
-
IDA pro (交互式反编译器专业版)是二进制安全研究人员必备的反汇编、反编译工具,功能繁多而强大,反编译结果清晰明了。
-## 安装
+IDA pro 是收费软件,价格极其昂贵,一套完全版人民币 10W 左右,因此可以到各大网站下载破解版,注意到一些知名网站下载,比如吾爱破解等,防止下载的软件包含病毒。在编写此文时,IDA pro 更新到了 8.3,网上能找到的最新的版本为 7.7。本文由于版权原因,不提供下载链接。
-IDA pro 是收费软件,价格极其昂贵,一般人买不起,因此可以到各大网站下载破解版,注意到一些知名网站下载,比如吾爱破解等,防止下载的软件包含病毒。在编写此文时,IDA pro 更新到了 8.0,网上能找到的最新的版本为 7.7。本文由于版权原因,不提供下载链接。
+# 简易使用方法
+
+> 本文档仅作快速入门,更加细节的内容还请读者查阅其他资料以及多加实践。
+>
+> 另外在任何使用上操作的问题,都可以在群里提问!
+
+## 0x00 IDA 简单介绍
+
+
+
+IDA是一款交互式反汇编和反编译工具,其支持文件类型和文件平台丰富。
+
+可静态分析也可动态调试,可以说是二进制手的吃饭工具了
+
+## 0x01 启动界面
+
+
+
+```
+NEW:打开IDA同时弹出对话框选择要打开的文件
+Go:单独打开ida,打开界面将文件拖入
+Previous,或者下面的列表项:快速打开之前的的文件
+```
+
+这里选择Go键,打开以后,将文件拖入
+
+
+
+
+
+这里按我们的默认选项点击OK即可
+
+## 0x02 关闭界面
+
+
+
+```
+第一个选项:就是不打包数据包文件,那么这些数据库文件就会分开这放。
+第二个选项及图中选项:就是把这几个数据库文件打包为1个(如.i64文件),下次打开我们分析的文件的时候,打开这个文件即可。
+第三个选项:不会删掉数据库文件,而是打包压缩到存储的文件里面去了。
+下面两个选项
+第一个选项:回收垃圾,如果打包文件太大了,可以选用这个选项,清理不必要的内存
+最后一个选项:当分析时候写错了,选中最后一个,最后一次打开的操作不保留了。(解决错误操作)
+```
+
+## 0x03 主界面- IDA View&Pseudocode
+
+反汇编代码的图表窗口
+
+
+
+ 按**空格键**切换成文本结构的反汇编
+
+
+
+ 按**F5**进行反编译跳转至`Pseudocode`(伪代码)界面
+
+
+
+然后就可以分析代码逻辑了
+
+直接点击函数名可以进入到对应函数内部查看函数逻辑
+
+## 0x04 主界面- Hex View
+
+十六进制窗口(不太常用)
+
+
+
+## 0x05 主界面-Structures
+
+结构体窗口
+
+
+
+## 0x06 主界面-Enums
+
+枚举类型界面
+
+
+
+## 0x07 主界面-Imports
+
+导入表
+
+可以查看当前模块用了哪些模块的哪些函数
+
+
+
+## 0x08 主界面-Exports
+
+导出表
+
+
+
+## 0x09 主界面-Strings
+
+按`Shift+F12`转到`String`界面,该操作会搜索程序中的字符串数据并展示
+
+
+
+按`Ctrl+F`后输入想要检索的字符可以快速搜索字符串
+
+
+
+## 0x0a 其他界面-Functions
+
+罗列了程序中用到的所有函数,包括底层调用的库的函数
+
+其中一般来说`main`是程序的主要函数
+
+
+
+## 0x0b 其他界面-Output
+
+程序的输出信息都会展示在这里
+
+其中包括插件的加载信息、插件/脚本运行时的输出等
+
+另外还可以直接在下面输入python语句,方便在ida使用过程中简单的数据处理
+
+
+
+## 0x0c 其他界面-导航栏
+
+一个二进制文件包括不同的区块,这里显示程序的不同类型数据,不同的颜色代表二进制文件中不同的块
+
+
+
+
+
+## 0x0d 常用快捷键
+
+> 边用边记,多打打就会记住了!
+>
+> 只记录了部分
+
+- `;` 为当前指令添加注释
+- `/` 在伪代码中添加注释
+- `g` 跳转到任意地址
+- `Esc` 返回到跳转前的位置
+- `n` 定义或修改名称,常用来修改函数和变量的名字
+- `A` 按照ASCII显示数据
+- `D` 分别按字节、字、双字来显示数据
+- `F5`反编译汇编代码,得到C伪代码
+- `Shift+F12` 搜索程序中的字符串
+
+- `Alt+t` 搜索程序中的指令
+- `Ctrl+x` 查看变量和函数的引用
+- `Y` 修改变量/函数类型
+- `F2`快速下断点
+
+## 0x0e 常用插件
+
+> 具体安装和使用不在此展开了
+
+- [Find Crypt](https://github.com/polymorf/findcrypt-yara) -- 寻找常用加密算法中的常数(需要安装 [yara-python](https://github.com/VirusTotal/yara-python))
+- [Keypatch](https://github.com/keystone-engine/keypatch) -- 基于 Keystone 的 Patch 二进制文件插件
+- [LazyIDA: Make your IDA Lazy! ](https://github.com/P4nda0s/LazyIDA) -- 快速Dump内存数据
+- [Finger](https://github.com/aliyunav/Finger) -- 函数签名识别插件
+- [D810](https://gitlab.com/eshard/d810) -- 去混淆插件
+
+## 0x10 IDA Python
+
+IDA 提供可与其交互的IDA Python接口,可以使用Python做很多的辅助操作
+
+
+
+可以参考这篇文章了解常用的接口
+
+[IDA Python 常用函数 | 4nsw3r's Blog](https://4nsw3r.top/2022/02/11/IDA Python 常用函数/)
+
+## 0x11 IDA 动态调试
+
+> 暂时只对Windows和Linux下的文件调试做介绍,Mac和Android下的文件调试有待读者后续探索
+
+### 调试Windows下的文件
+
+可以先在汇编代码或伪代码界面下断点,然后`F9`选择调试器,这里直接选`Local Windows Debugger`
+
+
+
+之后就可以用F7(单步不跳过执行)/F8(单步跳过执行)/F9(继续执行,遇到断点停止)进行调试
+
+
+
+### 调试Linux下的文件
+
+可以先在汇编代码或伪代码界面下断点
+
+
+
+由于Linux下文件调试比较特殊,需要远程起一个服务器运行服务端,这里可以使用**Vmware**或者**WSL2(Windows subsystem Linux)**进行调试
+
+因篇幅有限,在这里直接贴篇链接供大家学习并选择调试方式
+
+- Vmware 调试 [IDA动态调试ELF](https://bbs.pediy.com/thread-247830.htm)
+- WSL 调试 (安装好WSL直接运行ida dbgsrv目录下linux_server文件即可以)
+
+后面是一样的调试步骤
+
+## 0x12 一个简单程序的分析
+
+#### 源代码
+
+```c
+#include
+#include
+
+void change(char* str) {
+ for (int i = 0; i < strlen(str) ; i++) {
+ str[i] = str[i] - 1;
+ }
+}
+
+ int check(char* str){
+ return strcmp(str, "ek`fzHC@^0r^m/s^b/lo0dw2c|") == 0;
+ }
+
+int main() {
+ char input[100];
+ scanf("%100s", input);
+ change(input);
+ if (check(input)) {
+ printf("You are right\n");
+ }
+ else {
+ printf("You are wrong\n");
+ }
+}
+```
+
+#### 分析历程
+
+##### 将程序拖入IDA
+
+
+
+
+
+##### F5分析查看伪代码
+
+
+
+发现有`change`和`check`的自定义函数
+
+按`n`修改一下变量名
+
+
+
+
+
+分别进入里面查看函数逻辑
+
+##### 查看函数逻辑
+
+change函数
+
+
+
+check函数
+
+
+
+###### 静态分析逻辑
+
+change函数是对输入字符串的每一个字节进行修改
+
+然后在check函数进行比较
+
+###### 动态分析逻辑
+
+在change函数进入前下好断点
+
+随意的进行一些输入
+
+
+
+然后断下来
+
+
+
+F7进入函数进行单步不跳过调试
+
+
+
+遇到类似`strlen`等库函数可以F8单步调试跳过
+
+
+
+可以发现输入字符串的每一个字节的Ascii值都减小了1
+
+##### 脚本编写
+
+试试写一个脚本解出这道题吧!
-## 简易使用方法
-待更新~
From bbf32efa60fb85a3c660c8e7a651bf99ad60b157 Mon Sep 17 00:00:00 2001
From: camera-2018 <2907618001@qq.com>
Date: Wed, 19 Jul 2023 21:10:24 +0800
Subject: [PATCH 07/25] chore: update cos link
---
.../6.2.1基础工具的使用.md | 66 +++++++++----------
1 file changed, 33 insertions(+), 33 deletions(-)
diff --git a/6.计算机安全/6.2.1基础工具的使用.md b/6.计算机安全/6.2.1基础工具的使用.md
index 28f87bd..bb84678 100644
--- a/6.计算机安全/6.2.1基础工具的使用.md
+++ b/6.计算机安全/6.2.1基础工具的使用.md
@@ -12,7 +12,7 @@ IDA pro 是收费软件,价格极其昂贵,一套完全版人民币 10W 左
## 0x00 IDA 简单介绍
-
+
IDA是一款交互式反汇编和反编译工具,其支持文件类型和文件平台丰富。
@@ -20,7 +20,7 @@ IDA是一款交互式反汇编和反编译工具,其支持文件类型和文
## 0x01 启动界面
-
+
```
NEW:打开IDA同时弹出对话框选择要打开的文件
@@ -30,15 +30,15 @@ Previous,或者下面的列表项:快速打开之前的的文件
这里选择Go键,打开以后,将文件拖入
-
+
-
+
这里按我们的默认选项点击OK即可
## 0x02 关闭界面
-
+
```
第一个选项:就是不打包数据包文件,那么这些数据库文件就会分开这放。
@@ -53,15 +53,15 @@ Previous,或者下面的列表项:快速打开之前的的文件
反汇编代码的图表窗口
-
+
按**空格键**切换成文本结构的反汇编
-
+
按**F5**进行反编译跳转至`Pseudocode`(伪代码)界面
-
+
然后就可以分析代码逻辑了
@@ -71,19 +71,19 @@ Previous,或者下面的列表项:快速打开之前的的文件
十六进制窗口(不太常用)
-
+
## 0x05 主界面-Structures
结构体窗口
-
+
## 0x06 主界面-Enums
枚举类型界面
-
+
## 0x07 主界面-Imports
@@ -91,23 +91,23 @@ Previous,或者下面的列表项:快速打开之前的的文件
可以查看当前模块用了哪些模块的哪些函数
-
+
## 0x08 主界面-Exports
导出表
-
+
## 0x09 主界面-Strings
按`Shift+F12`转到`String`界面,该操作会搜索程序中的字符串数据并展示
-
+
按`Ctrl+F`后输入想要检索的字符可以快速搜索字符串
-
+
## 0x0a 其他界面-Functions
@@ -115,7 +115,7 @@ Previous,或者下面的列表项:快速打开之前的的文件
其中一般来说`main`是程序的主要函数
-
+
## 0x0b 其他界面-Output
@@ -125,13 +125,13 @@ Previous,或者下面的列表项:快速打开之前的的文件
另外还可以直接在下面输入python语句,方便在ida使用过程中简单的数据处理
-
+
## 0x0c 其他界面-导航栏
一个二进制文件包括不同的区块,这里显示程序的不同类型数据,不同的颜色代表二进制文件中不同的块
-
+
@@ -170,7 +170,7 @@ Previous,或者下面的列表项:快速打开之前的的文件
IDA 提供可与其交互的IDA Python接口,可以使用Python做很多的辅助操作
-
+
可以参考这篇文章了解常用的接口
@@ -184,17 +184,17 @@ IDA 提供可与其交互的IDA Python接口,可以使用Python做很多的辅
可以先在汇编代码或伪代码界面下断点,然后`F9`选择调试器,这里直接选`Local Windows Debugger`
-
+
之后就可以用F7(单步不跳过执行)/F8(单步跳过执行)/F9(继续执行,遇到断点停止)进行调试
-
+
### 调试Linux下的文件
可以先在汇编代码或伪代码界面下断点
-
+
由于Linux下文件调试比较特殊,需要远程起一个服务器运行服务端,这里可以使用**Vmware**或者**WSL2(Windows subsystem Linux)**进行调试
@@ -240,21 +240,21 @@ int main() {
##### 将程序拖入IDA
-
+
-
+
##### F5分析查看伪代码
-
+
发现有`change`和`check`的自定义函数
按`n`修改一下变量名
-
+
-
+
分别进入里面查看函数逻辑
@@ -262,11 +262,11 @@ int main() {
change函数
-
+
check函数
-
+
###### 静态分析逻辑
@@ -280,19 +280,19 @@ change函数是对输入字符串的每一个字节进行修改
随意的进行一些输入
-
+
然后断下来
-
+
F7进入函数进行单步不跳过调试
-
+
遇到类似`strlen`等库函数可以F8单步调试跳过
-
+
可以发现输入字符串的每一个字节的Ascii值都减小了1
From 2f5f669f6d3d078b1a70bc0facef392a601e294a Mon Sep 17 00:00:00 2001
From: camera-2018 <2907618001@qq.com>
Date: Wed, 19 Jul 2023 21:28:56 +0800
Subject: [PATCH 08/25] chore: nav
---
.vitepress/config.js | 12 ++----------
.vitepress/nav.js | 25 +++++++++++++++++++++++++
2 files changed, 27 insertions(+), 10 deletions(-)
create mode 100644 .vitepress/nav.js
diff --git a/.vitepress/config.js b/.vitepress/config.js
index 1012c44..03b383b 100644
--- a/.vitepress/config.js
+++ b/.vitepress/config.js
@@ -2,6 +2,7 @@
import { withMermaid } from "vitepress-plugin-mermaid";
import mathjax3 from 'markdown-it-mathjax3';
import { main_sidebar, chapter2, chapter3, chapter4, chapter5, chapter6, chapter7, chapter8 } from './sidebar.js';
+import { nav } from './nav.js';
import PanguPlugin from 'markdown-it-pangu'
const customElements = [
@@ -103,16 +104,7 @@ export default withMermaid({
head: [['script', { async: "async", src: 'https://umami.hdu-cs.wiki/script.js', "data-website-id": "3f11687a-faae-463a-b863-6127a8c28301", "data-domains": "wiki.xyxsw.site,hdu-cs.wiki" }]],
themeConfig: {
// https://vitepress.dev/reference/default-theme-config
- nav: [
- { text: '首页', link: '/' },
- { text: 'Wiki史', link: '/wiki史' },
- {
- text: '友链', items:
- [
- { text: '杭电导航', link: 'https://wiki.hduhelp.com' },
- ]
- },
- ],
+ nav: nav(),
sidebar: {
'/': main_sidebar(),
diff --git a/.vitepress/nav.js b/.vitepress/nav.js
new file mode 100644
index 0000000..2775ef7
--- /dev/null
+++ b/.vitepress/nav.js
@@ -0,0 +1,25 @@
+export function nav() {
+ return [
+ { text: '首页', link: '/' },
+ {
+ text: '章节', items:
+ [
+ { text: '1.杭电生存指南(最重要模块)', link: '/1.杭电生存指南/1.1人文社科的重要性(韩健夫老师寄语)' },
+ { text: '2.高效学习', link: '/2.高效学习/2.高效学习' },
+ { text: '3.编程思维体系构建', link: '/3.编程思维体系构建/3.编程思维体系构建' },
+ { text: '4.人工智能', link: '/4.人工智能/4.人工智能' },
+ { text: '5.富有生命的嵌入式', link: '/5.富有生命的嵌入式/5.富有生命的嵌入式' },
+ { text: '6.计算机安全', link: '/6.计算机安全/6.计算机安全' },
+ { text: '7.网络应用开发', link: '/7.网络应用开发/7.网络应用开发入门' },
+ { text: '8.基础学科', link: '/8.基础学科/8.基础学科' },
+ ]
+ },
+ { text: 'Wiki史', link: '/wiki史' },
+ {
+ text: '友链', items:
+ [
+ { text: '杭电导航', link: 'https://wiki.hduhelp.com' },
+ ]
+ },
+ ]
+}
\ No newline at end of file
From 5fd2410968cfddeed1e2bd3d6442781579491541 Mon Sep 17 00:00:00 2001
From: camera-2018 <2907618001@qq.com>
Date: Wed, 19 Jul 2023 21:47:31 +0800
Subject: [PATCH 09/25] chore: no drag
---
components/Parallax.vue | 3 +++
1 file changed, 3 insertions(+)
diff --git a/components/Parallax.vue b/components/Parallax.vue
index e9315d7..99973e5 100644
--- a/components/Parallax.vue
+++ b/components/Parallax.vue
@@ -11,6 +11,7 @@ const targetStyle: CSSProperties = {
display: 'flex',
flexDirection: 'column',
justifyContent: 'center',
+ userSelect: 'none',
transition: '.3s ease-out all',
}
const cardWindowStyle: CSSProperties = {
@@ -25,6 +26,8 @@ const cardWindowStyle: CSSProperties = {
}
const layerBase: CSSProperties = {
position: 'absolute',
+ userSelect: 'none',
+ "-webkit-user-drag": "none",
height: '100%',
width: '100%',
transition: '.3s ease-out all',
From 3133236ba924325f4d57792b717526ce008eb68e Mon Sep 17 00:00:00 2001
From: camera-2018 <2907618001@qq.com>
Date: Wed, 19 Jul 2023 22:44:33 +0800
Subject: [PATCH 10/25] chore: width
---
components/Parallax.vue | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/components/Parallax.vue b/components/Parallax.vue
index 99973e5..620ffb0 100644
--- a/components/Parallax.vue
+++ b/components/Parallax.vue
@@ -69,9 +69,9 @@ const layer4 = layerBase
const cardStyle = computed(() => ({
background: '',
- height: '20rem',
- width: '15rem',
- borderRadius: '5px',
+ height: '14rem',
+ width: '20rem',
+ borderRadius: '20px',
border: '1px solid #000000',
overflow: 'hidden',
transition: '.3s ease-out all',
From eea4e63db4a80e58d20bf1923de6b462f3542b6f Mon Sep 17 00:00:00 2001
From: Bird
Date: Thu, 20 Jul 2023 11:00:38 +0800
Subject: [PATCH 11/25] ci: links check during pr and everyday
Signed-off-by: Bird
---
.github/workflows/cos.yaml | 18 ++++++-----
.github/workflows/link-pr.yaml | 40 +++++++++++++++++++++++++
.github/workflows/link-schedule.yaml | 45 ++++++++++++++++++++++++++++
.gitignore | 3 +-
.lycheeignore | 2 ++
5 files changed, 99 insertions(+), 9 deletions(-)
create mode 100644 .github/workflows/link-pr.yaml
create mode 100644 .github/workflows/link-schedule.yaml
create mode 100644 .lycheeignore
diff --git a/.github/workflows/cos.yaml b/.github/workflows/cos.yaml
index 8b8b5bc..fe5dd1b 100644
--- a/.github/workflows/cos.yaml
+++ b/.github/workflows/cos.yaml
@@ -11,17 +11,19 @@ jobs:
steps:
- name: checkout
- uses: actions/checkout@master
-
- - name: install dependencies
- run: |
- sudo pip install coscmd
- sudo pip install tccli
- npm i
+ uses: actions/checkout@v3
+
+ - name: install doc dependencies
+ run: sudo npm i
- name: build
run: |
npm run docs:build
+
+ - name: install coscmd and tccli
+ run: |
+ sudo pip3 install coscmd
+ sudo pip3 install tccli
- name: confirgure coscmd and tccli
env:
@@ -38,4 +40,4 @@ jobs:
- name: upload and refresh cdn
run: |
coscmd upload -rfs --delete ./.vitepress/dist/ /
- tccli cdn PurgePathCache --cli-unfold-argument --Paths https://wiki.xyxsw.site/ --FlushType flush
\ No newline at end of file
+ tccli cdn PurgePathCache --cli-unfold-argument --Paths https://wiki.xyxsw.site/ --FlushType flush
diff --git a/.github/workflows/link-pr.yaml b/.github/workflows/link-pr.yaml
new file mode 100644
index 0000000..54efb3e
--- /dev/null
+++ b/.github/workflows/link-pr.yaml
@@ -0,0 +1,40 @@
+name: links when pr
+
+on:
+ pull_request:
+ branches: [ master ]
+ paths:
+ - '**.md'
+ - '.lycheeignore'
+
+jobs:
+ linkChecker:
+ runs-on: ubuntu-latest
+ steps:
+ - name: checkout
+ uses: actions/checkout@v3
+
+ - name: install doc dependencies
+ run: sudo npm i
+
+ - name: build
+ run: |
+ npm run docs:build
+
+ - name: Link Checker
+ uses: lycheeverse/lychee-action@v1.8.0
+ with:
+ fail: true
+ # For parameter description, see https://github.com/lycheeverse/lychee#commandline-parameters
+ # -E, --exclude-all-private Exclude all private IPs from checking.
+ # -i, --insecure Proceed for server connections considered insecure (invalid TLS)
+ # -n, --no-progress Do not show progress bar.
+ # -t, --timeout Website timeout in seconds from connect to response finished [default:20]
+ # --max-concurrency Maximum number of concurrent network requests [default: 128]
+ # -a --accept Comma-separated list of accepted status codes for valid links
+
+ # .vitepress/dist the site directory to check
+ # *.md all markdown files in the root directory
+ args: -E -i -n -t 45 --max-concurrency 64 -a 401,403 -- '.vitepress/dist' '*.md'
+ env:
+ GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
diff --git a/.github/workflows/link-schedule.yaml b/.github/workflows/link-schedule.yaml
new file mode 100644
index 0000000..ea6cabd
--- /dev/null
+++ b/.github/workflows/link-schedule.yaml
@@ -0,0 +1,45 @@
+name: links
+
+on:
+ # repository_dispatch:
+ workflow_dispatch:
+ schedule:
+ - cron: "30 8 * * *"
+
+jobs:
+ linkChecker:
+ runs-on: ubuntu-latest
+ steps:
+ - name: checkout
+ uses: actions/checkout@v3
+
+ - name: install doc dependencies
+ run: sudo npm i
+
+ - name: build
+ run: |
+ npm run docs:build
+
+ - name: Link Checker
+ uses: lycheeverse/lychee-action@v1.8.0
+ with:
+ # For parameter description, see https://github.com/lycheeverse/lychee#commandline-parameters
+ # -E, --exclude-all-private Exclude all private IPs from checking.
+ # -i, --insecure Proceed for server connections considered insecure (invalid TLS)
+ # -n, --no-progress Do not show progress bar.
+ # -t, --timeout Website timeout in seconds from connect to response finished [default:20]
+ # --max-concurrency Maximum number of concurrent network requests [default: 128]
+ # -a --accept Comma-separated list of accepted status codes for valid links
+
+ # .vitepress/dist the site directory to check
+ # *.md all markdown files in the root directory
+ args: -E -i -n -t 45 --max-concurrency 64 -a 401,403 -- '.vitepress/dist' '*.md'
+ output: out.md
+ env:
+ GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
+ - name: Create Issue From File
+ uses: peter-evans/create-issue-from-file@v3
+ with:
+ title: Broken Link Detected
+ content-filepath: out.md
+ assignees: nightwhite
diff --git a/.gitignore b/.gitignore
index 03d85d5..8040e26 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
node_modules
dist
cache
-.temp
\ No newline at end of file
+.temp
+.vitepress/dist
diff --git a/.lycheeignore b/.lycheeignore
new file mode 100644
index 0000000..e483565
--- /dev/null
+++ b/.lycheeignore
@@ -0,0 +1,2 @@
+hdu-cs-wiki/edit
+file://
From 83ed4c883eb00a202ae18f480c57b1b26d46a6b1 Mon Sep 17 00:00:00 2001
From: camera-2018 <2907618001@qq.com>
Date: Thu, 20 Jul 2023 11:54:41 +0800
Subject: [PATCH 12/25] =?UTF-8?q?chore:=20=E5=B8=85=EF=BC=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
components/Parallax.vue | 110 +++++++++++++++++++++++++++++++---------
public/sparkles.gif | Bin 0 -> 1966867 bytes
2 files changed, 87 insertions(+), 23 deletions(-)
create mode 100644 public/sparkles.gif
diff --git a/components/Parallax.vue b/components/Parallax.vue
index 620ffb0..fe7ce8b 100644
--- a/components/Parallax.vue
+++ b/components/Parallax.vue
@@ -39,30 +39,40 @@ const containerStyle: CSSProperties = {
const layer0 = computed(() => ({
...layerBase,
- transform: `translateX(${parallax.tilt * 10}px) translateY(${
- parallax.roll * 10
- }px) scale(1)`,
+ transform: `translateX(${parallax.tilt * 10}px) translateY(${parallax.roll * 10
+ }px) scale(1)`,
}))
const layer1 = computed(() => ({
- ...layerBase,
- transform: `translateX(${parallax.tilt * 20}px) translateY(${
- parallax.roll * 20
- }px) scale(1.33)`,
+ userSelect: 'none',
+ "-webkit-user-drag": "none",
+ transform: `translateX(${parallax.tilt * 20}px) translateY(${parallax.roll * 20
+ }px) scale(1.33)`,
+ 'background-image': 'linear-gradient(125deg, #ff008450 15%, #fca40040 30%, #ffff0030 40%, #00ff8a20 60%, #00cfff40 70%, #cc4cfa50 85%)',
+ 'background-position': '50% 50%',
+ 'background-size': '160%',
+ 'background-blend-mode': 'overlay',
+ filter: 'brightness(1) contrast(1)',
+ 'mix-blend-mode': 'color-dodge',
+ opacity: '1',
+ position: 'absolute',
}))
const layer2 = computed(() => ({
- ...layerBase,
- transform: `translateX(${parallax.tilt * 30}px) translateY(${
- parallax.roll * 30
- }px) scale(1.33)`,
+ transform: `translateX(${parallax.tilt * 30}px) translateY(${parallax.roll * 30
+ }px) scale(1.33)`,
+ 'background-image': 'linear-gradient(115deg,transparent 0%,#ec9bb6 25%,transparent 47%,transparent 53%,#ccac6f 75%,transparent 100%)',
+ opacity: '.1',
+ filter: 'brightness(.5) contrast(1)',
+ width: '100%',
+ height: '100%',
+ position: 'absolute',
}))
const layer3 = computed(() => ({
...layerBase,
- transform: `translateX(${parallax.tilt * 40}px) translateY(${
- parallax.roll * 40
- }px) scale(1.33)`,
+ transform: `translateX(${parallax.tilt * 40}px) translateY(${parallax.roll * 40
+ }px) scale(1.33)`,
}))
const layer4 = layerBase
@@ -75,10 +85,9 @@ const cardStyle = computed(() => ({
border: '1px solid #000000',
overflow: 'hidden',
transition: '.3s ease-out all',
- boxShadow: '0 0 20px 0 rgba(255, 255, 255, 0.1)',
- transform: `rotateX(${parallax.roll * 20}deg) rotateY(${
- parallax.tilt * 20
- }deg)`,
+ boxShadow: '-20px -20px 30px -25px #ec9bb6, 20px 20px 30px -25px #ccac6f, -7px -7px 10px -5px #ec9bb6, 7px 7px 10px -5px #ccac6f, 0 0 13px 4px rgba(255,255,255,0.3),0 55px 35px -20px rgba(0, 0, 0, 0.5)',
+ transform: `rotateX(${parallax.roll * 20}deg) rotateY(${parallax.tilt * 20
+ }deg)`,
}))
@@ -93,15 +102,70 @@ export default {
+
+
\ No newline at end of file
diff --git a/public/sparkles.gif b/public/sparkles.gif
new file mode 100644
index 0000000000000000000000000000000000000000..8e8d55bc21702533d6e814664fe6ed33027609e9
GIT binary patch
literal 1966867
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