diff --git a/2016/07/14/connect-in-unix/index.html b/2016/07/14/connect-in-unix/index.html new file mode 100644 index 000000000..38d4b3ca8 --- /dev/null +++ b/2016/07/14/connect-in-unix/index.html @@ -0,0 +1,2032 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + UNIX网络编程-connect函数及其包裹函数介绍 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + UNIX网络编程-connect函数及其包裹函数介绍 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + + + +
+ + + + +
+ 字数统计: 397阅读时长: 8 min +
+ +
+ + + 2016/07/14 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文将介绍UNIX网络编程中connect函数及其包裹函数。

+ + +

函数简介

1
2
3
4
5
#include<sys/socket.h>
#include<sys/types.h>

int connect(int sockfd, const struct sockaddr* server_addr, socklen_t addrlen);
返回值:若成功返回0;若失败则返回-1.
+ +

connect函数用于客户端建立tcp连接,发起三次握手过程。其中sockfd标识了主动套接字,server_addr是该套接字要连接的主机地址和端口号,addrlenserver_addr缓冲区的长度。

+

连接失败时,可以根据以下errno值判断失败的原因:

+
1
2
3
4
5
6
7
8
9
EBADF:参数sockfd 非合法socket处理代码;
EFAULT:参数serv_addr指针指向无法存取的内存空间;
ENOTSOCK:参数sockfd为一文件描述词,非socket;
EISCONN:参数sockfd的socket已是连线状态;
ECONNREFUSED:连线要求被server端拒绝;
ETIMEDOUT:企图连线的操作超过限定时间仍未有响应;
ENETUNREACH:无法传送数据包至指定的主机;
EAFNOSUPPORT:sockaddr结构的sa_family不正确;
EALREADY:socket为不可阻塞且先前的连线操作还未完成;
+ +

包裹函数(下载)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<sys/socket.h>
#include<sys/types.h>
#include<stdlib.h>

#define MAXSLEEP 128

int my_connect(int sockfd,const struct sockaddr *servaddr,socklen_t addrlen)
{
int nsec;
for(nsec = 1;nsec <= MAXSLEEP;nsec <<= 1)
{
if(connect(sockfd,servaddr,addrlen) == 0)
return 0;//connection accepted
if(nsec <= MAXSLEEP/2)//sleep nesc,then connect retry
sleep(nsec);
}
return -1;
}
+ +

包裹函数为connect函数设置了超时重连的机制,如果连接成功,则成功返回。如果连接失败,则每次等待1、2、4、8。。。秒后继续尝试重新连接,直到MAXSLEEP为止。

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2016/07/14/connect-in-unix/ +

发表日期:2016/07/14 14:07

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 函数简介
  2. 2. 包裹函数(下载)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2016/07/14/debug-for-shell-script/index.html b/2016/07/14/debug-for-shell-script/index.html new file mode 100644 index 000000000..c81f9edc0 --- /dev/null +++ b/2016/07/14/debug-for-shell-script/index.html @@ -0,0 +1,2039 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Linux Shell 脚本调试总结 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + Linux Shell 脚本调试总结 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 815阅读时长: 18 min +
+ +
+ + + 2016/07/14 + + + + +
+
+ +
+
+ + + + +
+
+
+

Shell脚本是用户与Linux操作系统交互的一种方式,在脚本编程过程中自然少不了进行调试工作,本文将介绍三种常用的调试方法.(默认使用bash shell)

+ + +

追踪脚本的执行

使用**-x**选项可以打印出脚本执行的每一行命令以及当前状态.
有如下脚本,打印数字1到10:

+
1
2
3
4
5
6
#!/bin/bash

for i in {1..10}
do
echo $i
done
+

我们使用**-x**选项进行调试如下:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#在每一行前加上行号
export PS4='+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '
#进行调试
sh -x test.sh
#调试结果
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 1
1
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 2
2
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 3
3
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 4
4
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 5
5
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 6
6
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 7
7
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 8
8
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 9
9
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 10
10
+ +

有时候,你只需要对脚本的一部分进行调试,那么可以使用如下命令:

+
1
2
3
4
set -x #在执行时显示参数和命令
set +x #禁止调试
set -v #当命令行读取时显示输入
set +v #禁止打印输入
+

可以使用set builtin来启用或者禁止调试打印.
对上文脚本做如下修改:

+
1
2
3
4
5
6
7
8
#!/bin/bash

for i in {1..10}
do
set -x
echo $i
set +x
done
+

结果如下:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
+test.sh:6:: echo 1
1
+test.sh:7:: set +x
+test.sh:6:: echo 2
2
+test.sh:7:: set +x
+test.sh:6:: echo 3
3
+test.sh:7:: set +x
+test.sh:6:: echo 4
4
+test.sh:7:: set +x
+test.sh:6:: echo 5
5
+test.sh:7:: set +x
+test.sh:6:: echo 6
6
+test.sh:7:: set +x
+test.sh:6:: echo 7
7
+test.sh:7:: set +x
+test.sh:6:: echo 8
8
+test.sh:7:: set +x
+test.sh:6:: echo 9
9
+test.sh:7:: set +x
+test.sh:6:: echo 10
10
+test.sh:7:: set +x
+ +

自定义日志

上面这种调试手段是bash内建的,而且输出格式固定而且繁琐.所以我们需要根据需要的信息,自定义格式来显示调试信息,通过设定_DEBUG环境变量来完成:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

# run:_DEBUG=on sh debug.sh

function DEBUG()
{
[ "$_DEBUG" == "on" ] && $@ || :
}

for i in {1..5}
do
DEBUG echo -e "This is debug line!"
echo $i
done

+

我们将_DEBUG环境变量设定为一个开关,只有打开时才会输出调试日志.
使用如上脚本结果如下:

+
1
2
3
4
5
6
7
8
9
10
11
[aidu1602@ResU10 tools]$ _DEBUG=on sh debug.sh
This is debug line!
1
This is debug line!
2
This is debug line!
3
This is debug line!
4
This is debug line!
5
+

这样我们就可以自定义调试信息,并且可以控制调试开关啦.

+

使用专用调试器

如果你需要调试一个非常复杂的脚本,并且需要一个及其专业的调试器,像GDB那样,那么我推荐这款开源的脚本调试器bashdb,具体使用可以参考它的文档.

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2016/07/14/debug-for-shell-script/ +

发表日期:2016/07/14 14:07

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 追踪脚本的执行
  2. 2. 自定义日志
  3. 3. 使用专用调试器
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2016/07/14/debug-macro/index.html b/2016/07/14/debug-macro/index.html new file mode 100644 index 000000000..001610920 --- /dev/null +++ b/2016/07/14/debug-macro/index.html @@ -0,0 +1,2027 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Linux C编程的DEBUG宏 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + Linux C编程的DEBUG宏 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 232阅读时长: 5 min +
+ +
+ + + 2016/07/14 + + + + +
+
+ +
+
+ + + + +
+
+
+

DEBUG宏用于Linux下C编程时调试使用.

+ + +

实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*************************************************************************
> File Name: debug.c
> Author: AnSwEr
> Mail: 1045837697@qq.com
> Created Time: 2015年07月23日 星期四 18时19分48秒
************************************************************************/

#include<stdio.h>
#define DEBUG_PRINT do{}while(0)

#if defined(DEBUG_PRINT)
#define DEBUG(...)\
do{\
fprintf(stderr,"-----DEBUG-----\n");\
fprintf(stderr,"%s %s\n",__TIME__,__DATE__);\
fprintf(stderr,"%s:%d:%s():",__FILE__,__LINE__,__func__);\
fprintf(stderr,__VA_ARGS__);\
}while(0)
#endif

int main(void)
{
DEBUG("Debug successfully!\n");
return 0;
}
+ +

说明

    +
  1. *do{}while(0):使用do{…}while(0)*构造后的宏定义不会受到大括号、分号等的影响,而且可以定义空宏而不受警告。
  2. +
  3. 参数介绍:
    1
    2
    3
    4
    5
    6
    __LINE__:在源代码中插入当前源代码行号;
    __FILE__:在源文件中插入当前源文件名;
    __DATE__:在源文件中插入当前的编译日期
    __TIME__:在源文件中插入当前编译时间;
    __func__:输出函数名称,功能与_Function_相同;
    __VA_ARGS__:可变参数类型。
  4. +
+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2016/07/14/debug-macro/ +

发表日期:2016/07/14 14:07

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 实现代码
  2. 2. 说明
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2016/07/14/fork-bomb/index.html b/2016/07/14/fork-bomb/index.html new file mode 100644 index 000000000..6c2ce96d6 --- /dev/null +++ b/2016/07/14/fork-bomb/index.html @@ -0,0 +1,2029 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Linux fork炸弹解析 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + Linux fork炸弹解析 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 361阅读时长: 7 min +
+ +
+ + + 2016/07/14 + + + + +
+
+ +
+
+ + + + +
+
+
+

**:(){ :|: & };:**是一个bash函数,以Fork Bomb闻名,是一个拒绝服务攻击 的Linux 系统。如果你好奇地去执行了这个命令,那么赶快重启系统吧~!

+ + +

命令解析

1
2
3
4
:()
{
: | : &
};:
+
    +
  1. 在这里是一个函数名,我们定义之,并在后面执行它。
  2. +
  3. **:|:&**,:函数的输出通过管道传给另一个冒号函数作为输入,并且在后台执行。
  4. +
  5. **{ };**标识着里面的内容是一个函数主体。
  6. +
  7. 最后一个为定义完成后的一次函数执行。
  8. +
+

原理解析

    +
  1. 首先需要说明的是**:是一个shell内置命令,所以上面这段代码只有在bash中才可能产生fork炸弹,因为在其他一些shell中,内置命令的优先级高于函数,所以执行*:*,总是执行内置命令。(:**是一个空命令,while true等同于 while ,常用作占位符)
  2. +
  3. 先来看看函数的主体**:|:&**,使用管道的时候是两个进程同时开始执行。
  4. +
  5. 所以当执行一个函数时,产生两个新进程,然后一个原来的进程退出,这样不停地递归下去,就产生了一个无限递归。按照这个增长模式的化,其增长趋势约为$2^n$。
  6. +
+

总结

Linux中还有很多这样存在这陷阱的命令,这也正是我喜欢Linux系统的原因,充满着探索性。

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2016/07/14/fork-bomb/ +

发表日期:2016/07/14 13:07

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 命令解析
  2. 2. 原理解析
  3. 3. 总结
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2016/07/14/generate-random-numbers/index.html b/2016/07/14/generate-random-numbers/index.html new file mode 100644 index 000000000..5c4a6f517 --- /dev/null +++ b/2016/07/14/generate-random-numbers/index.html @@ -0,0 +1,2041 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + C语言生成随机数 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + C语言生成随机数 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 495阅读时长: 10 min +
+ +
+ + + 2016/07/14 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文将介绍C语言生成随机数的方法,主要使用 rand() 函数和 srand() 函数.

+ + +

rand函数

函数介绍

*rand()*函数是产生随机数的一个随机函数:

+
1
2
3
#include<stdlib.h>

int rand(void);
+

返回值:
*rand()*返回值为一随机数值,范围在0至RAND_MAX 间(RAND_MAX定义在stdlib.h,其值为2147483647)。

+
+

注:在调用此函数前,必须先利用srand()设好随机数种子。如果未设随机数种子,rand()在调用时会自动设随机数种子为1。

+
+

示例一:

代码:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/*************************************************************************
> File Name: rand.c
> Author: AnSwEr
> Mail: 1045837697@qq.com
> Created Time: 2015年10月24日 星期六 20时50分59秒
************************************************************************/

/*
* 产生1到6的随机数
*/

#include<stdio.h>
#include<stdlib.h>

int main(void)
{
int i = 0;

for(i=0;i<10;i++)
{
printf("%d ",rand()%6+1);
}
printf("\n");

return 0;
}
+ +

运行结果:
这里写图片描述

+

说明:这里两次运行的结果相同,是因为未利用*srand()*设置随机数种子,所以rand()在调用时会自动设随机数种子为1。

+

srand函数

函数介绍

*srand()*函数是随机数发生器的初始化函数:

+
1
2
3
#include<stdlib.h>

void srand (unsigned int seed);
+

参数:
seed必须是个整数,通常可以利用*geypid()time(0)的返回值来当做seed。如果每次seed都设相同值,那么rand()*所产生的随机数值会像上面的示例一每次就会一样。

+

示例二:

代码:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*************************************************************************
> File Name: srand.c
> Author: AnSwEr
> Mail: 1045837697@qq.com
> Created Time: 2015年10月24日 星期六 21时01分58秒
************************************************************************/

/*
* 产生1-6的随机数
*/

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(void)
{
int i = 0;

srand((unsigned int)time(NULL));
for(i=0;i<10;i++)
{
printf("%d ",rand()%6+1);
}
printf("\n");

return 0;
}
+ +

运行结果:
这里写图片描述

+

哈哈,这下两次结果就不同了吧。

+

总结

关于随机数的知识就先总结这么多,以后碰到更复杂的再继续。

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2016/07/14/generate-random-numbers/ +

发表日期:2016/07/14 14:07

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. rand函数
    1. 1.1. 函数介绍
    2. 1.2. 示例一:
  2. 2. srand函数
    1. 2.1. 函数介绍
    2. 2.2. 示例二:
  3. 3. 总结
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2016/07/14/keepalive-of-socket/index.html b/2016/07/14/keepalive-of-socket/index.html new file mode 100644 index 000000000..8cad224fd --- /dev/null +++ b/2016/07/14/keepalive-of-socket/index.html @@ -0,0 +1,2045 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Linux socket编程的心跳机制总结 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + Linux socket编程的心跳机制总结 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + + + +
+ + + + +
+ 字数统计: 1.1k阅读时长: 23 min +
+ +
+ + + 2016/07/14 + + + + +
+
+ +
+
+ + + + +
+
+
+

心跳机制用于保持客户端和服务端的连接.

+ + +

什么是心跳机制

心跳机制就是当客户端与服务端建立连接后,每隔几分钟发送一个固定消息给服务端,服务端收到后回复一个固定消息给客户端,如果服务端几分钟内没有收到客户端消息,则视客户端断开。发送方可以是客户端和服务端,看具体需求。

+

为什么要使用

我们都知道在TCP这种长连接情况下下,有可能有一大段时间是没有数据往来的,即处于空闲状态。理论上说,这个连接是一直保持连接的,但是在实际应用中,如果中间节点出现什么故障是难以预测的。更可怕的是,有的节点会自动把一定时间之内没有数据交互的连接切断。所以,需要我们利用心跳机制,来维持长连接,保活通信。

+

实现方法

    +
  • 应用层: 由应用程序自己每隔一定时间向客户/服务端发送一个短小的数据包,然后启动一个线程,在线程中不断检测客户端的回应, 如果在一定时间内没有收到客户/服务端的回应,即认为客户/服务端已经掉线,连接不可用。
  • +
  • 设置SO_KEEPALIVE套接字选项:在TCP通信中,存在heartbeat机制。其实就是TCP的选项。当服务/客户端,一方开启KeepAlive功能后,就会自动在规定时间内向对方发送心跳包, 而另一方在收到心跳包后就会自动回复,以告诉对方我仍然在线。
    +

    注意:因为开启KeepAlive功能需要消耗额外的宽带和流量,所以TCP协议层默认并不默认开启KeepAlive。KeepAlive超时需要7,200,000 MilliSeconds, 即2小时,探测次数为5次。对于很多应用程序来说,空闲时间太长。因此,我们可以手工开启KeepAlive功能并设置合理的KeepAlive参数。

    +
    +
  • +
+

我的实现

这里具体介绍设置SO_KEEPALIVE套接字选项这个方法。

+

SO_KEEPALIVE的三个参数:

    +
  1. tcp_keepalive_intvl:探测发包间隔为intvl。
  2. +
  3. tcp_keepalive_idle:连接在idle时间内没有任何数据往来,则进行此TCP层的探测。
  4. +
  5. tcp_keepalive_cnt:尝试探测的次数。
  6. +
+

setsockopt()函数介绍

    +
  1. 用法:设置与某个套接字关联的选 项。选项可能存在于多层协议中,它们总会出现在最上面的套接字层。
  2. +
  3. 函数原型:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <sys/types.h>
    #include <sys/socket.h>
    int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);

    参数:
    sock:将要被设置或者获取选项的套接字。
    level:选项所在的协议层。
    optname:需要访问的选项名。
    optval:对于getsockopt(),指向返回选项值的缓冲。对于setsockopt(),指向包含新选项值的缓冲。
    optlen:对于getsockopt(),作为入口参数时,选项值的最大长度。作为出口参数时,选项值的实际长度。对于setsockopt(),现选项的长度。

    返回说明:
    成功执行时,返回0。失败返回-1,errno被设为以下的某个值
    EBADF:sock不是有效的文件描述词
    EFAULT:optval指向的内存并非有效的进程空间
    EINVAL:在调用setsockopt()时,optlen无效
    ENOPROTOOPT:指定的协议层不能识别选项
    ENOTSOCK:sock描述的不是套接字
  4. +
+

具体代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
int heartbeat(int fd)
{
int alive,error,idle,cnt,intv;

/*
* open keepalive on fd
*/
Restart:
alive = 1;//set keepalive open
ret=setsockopt(fd,SOL_SOCKET,SO_KEEPALIVE,&alive,sizeof(alive));
if(ret < 0)
{
DEBUG("set socket option error.\n");
goto Restart;
}

/*
* 60S without data,send heartbeat package
*/
idle = 60;
ret = setsockopt(fd,SOL_TCP,TCP_KEEPIDLE,&idle,sizeof(idle));
if(ret < 0)
{
DEBUG("set keepalive idle error.\n");
return -1;
}

/*
* without any respond,3m later resend package
*/
intv = 180;
ret = setsockopt(fd,SOL_TCP,TCP_KEEPINTVL,&intv,sizeof(intv));
if(ret < 0)
{
DEBUG("set keepalive intv error.\n");
return -2;
}

/*
* send 5 times,without any response,mean connect lose
*/
cnt = 5;
ret = setsockopt(fd,SOL_TCP,TCP_KEEPCNT,&cnt,sizeof(cnt));
if(ret < 0)
{
DEBUG("set keepalive cnt error.\n");
return -3;
}
}
+ +

总结

当然,还是有很多方法去实现心跳机制的,比如利用select实现的超时控制,或者利用守护进程或线程的单独检测。不过我个人认为设置SO_KEEPALIVE实现起来最简单,最方便。如果大家发现有什么问题,也欢迎大家交流。

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2016/07/14/keepalive-of-socket/ +

发表日期:2016/07/14 14:07

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 什么是心跳机制
  2. 2. 为什么要使用
  3. 3. 实现方法
    1. 3.1. 我的实现
      1. 3.1.1. SO_KEEPALIVE的三个参数:
      2. 3.1.2. setsockopt()函数介绍
      3. 3.1.3. 具体代码
  4. 4. 总结
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2016/07/14/safe-read-and-write/index.html b/2016/07/14/safe-read-and-write/index.html new file mode 100644 index 000000000..38bb5449e --- /dev/null +++ b/2016/07/14/safe-read-and-write/index.html @@ -0,0 +1,2028 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + UNIX编程安全读写函数 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + UNIX编程安全读写函数 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + + + +
+ + + + +
+ 字数统计: 399阅读时长: 8 min +
+ +
+ + + 2016/07/14 + + + + +
+
+ +
+
+ + + + +
+
+
+

字节流套接字(TCP套接字)上的read和write函数所表现的行为不同于通常的文件I/O。字节流套接字调用read或write输入或输出的字节数可能比请求的数量少,然而这并不是出错的状态。这是因为内核中用于套接字的缓冲区可能达到了极限。通常这种情况出现在一次读多于4096个字节或write在非阻塞情况下返回不足字节数。为了不多次调用read或防止write返回不足字节数,我们用下面的两个函数来替代read和write。

+ + +

readn

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<stdio.h>
#include<unistd.h>
#include<errno.h>

ssize_t safe_read(int fd,void *vptr,size_t n)
{
size_t nleft;
ssize_t nread;
char *ptr;

ptr=vptr;
nleft=n;

while(nleft > 0)
{
if((nread = read(fd,ptr,nleft)) < 0)
{
if(errno == EINTR) //被信号中断,重读
nread = 0;
else //出错
return -1;
}
else if(nread == 0) //EOF
break;

nleft -= nread;
ptr += nread;
}
return (n-nleft);
}
+ +

writen

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
#include<unistd.h>
#include<errno.h>

ssize_t safe_write(int fd, const void *vptr, size_t n)
{
size_t nleft;
ssize_t nwritten;
const char *ptr;

ptr = vptr;
nleft = n;

while(nleft > 0)
{
if((nwritten = write(fd, ptr, nleft)) <= 0)
{
if(nwritten < 0 && errno == EINTR) //被信号中断,重写
nwritten = 0;
else //error
return -1;
}
nleft -= nwritten;
ptr += nwritten;
}
return(n);
}
+ +

总结

上面介绍了两个安全读写函数,但是并不意味着这两个函数在任何地方都完全适用,所以不要强迫自己使用。需要注意阻塞、效率等问题,当你只是读写少量字节时,就没必要使用了。

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2016/07/14/safe-read-and-write/ +

发表日期:2016/07/14 14:07

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. readn
  2. 2. writen
  3. 3. 总结
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2016/07/14/script-and-scriptreplay/index.html b/2016/07/14/script-and-scriptreplay/index.html new file mode 100644 index 000000000..7bddf9099 --- /dev/null +++ b/2016/07/14/script-and-scriptreplay/index.html @@ -0,0 +1,2032 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Linux下脚本录制工具——script和scriptreplay · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + Linux下脚本录制工具——script和scriptreplay + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + + + +
+ + + + +
+ 字数统计: 179阅读时长: 3 min +
+ +
+ + + 2016/07/14 + + + + +
+
+ +
+
+ + + + +
+
+
+

在Linux开发环境下,想要录制一段屏幕视屏不是特别方便。这里分享给大家一种方便而且快捷的方法。

+ + +

使用

Linux下有script和scriptreplay这两个工具组合用于录制命令行。在新版本系统中,已经集成了这两个工具,所以直接使用即可:

+
1
2
3
4
5
$ script -t 2>timing.log -a >output.session
$ <command>
$ <command>
$ exit
$ scriptreplay timing.log output.session
+ +

说明:

+
    +
  • 选项-t用于存储时序文件,这里导入到stderr,再重定向到timing.log。
  • +
  • 选项-a用于将命令输出信息,重定向到output.session文件。
  • +
  • 这两个文件很小,可以拷贝到需要播放的机器上进行播放。
  • +
+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2016/07/14/script-and-scriptreplay/ +

发表日期:2016/07/14 14:07

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 使用
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2016/07/14/solution-of-adb-devices-no-permissions/index.html b/2016/07/14/solution-of-adb-devices-no-permissions/index.html new file mode 100644 index 000000000..d204c9fe3 --- /dev/null +++ b/2016/07/14/solution-of-adb-devices-no-permissions/index.html @@ -0,0 +1,2046 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Linux下adb devices no permissions解决方案 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + Linux下adb devices no permissions解决方案 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 292阅读时长: 6 min +
+ +
+ + + 2016/07/14 + + + + +
+
+ +
+
+ + + + +
+
+
+

Linux下adb工具下载,下载解压到*/usr/bin*目录。

+ + +

问题

当我们在Linux下连接安卓手机,进行adb调试时,执行

+
1
$ adb devices
+

会出现如下错误提示:

+
1
2
List of devices attached
???????????? no permissions
+ +

解决方案

首先创建一个规则配置文件:

+
1
$ sudo vi /etc/udev/rules.d/70-android.rules
+

保存并退出。

+

查看USB设备信息,拔掉设备再查看一次,就可以比较出安卓设备是哪一个了,我的设备信息如下:

+
1
2
$ lsusb
Bus 003 Device 011: ID 1f3a:1002 Onda (unverified)
+ +

打开刚才的规则配置文件,写入如下内容:

+
1
SUBSYSTEM=="usb",ATTRS{idVendor}=="1f3a",ATTRS{idProduct}=="1002", MODE="0666"
+

其中idvendor和idProduct指的是usb的id号,ID 1f3a是idVendor ,1002就是 idProduct。

+

然后赋予文件权限

+
1
$ sudo chmod a+x /etc/udev/rules.d/70-android.rules
+ +

重启udev:

+
1
$ sudo /etc/init.d/udev restart
+ +

注意,这里一定要拔掉设备再重连!然后执行如下命令:

+
1
2
$ sudo adb kill-server
$ adb devices
+

显示信息如下:

+
1
2
3
4
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
20080411 device
+

那么说明连接成功,可以正常进行调试了。

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2016/07/14/solution-of-adb-devices-no-permissions/ +

发表日期:2016/07/14 14:07

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 问题
  2. 2. 解决方案
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2016/08/02/link-in-linux/index.html b/2016/08/02/link-in-linux/index.html new file mode 100644 index 000000000..23448619f --- /dev/null +++ b/2016/08/02/link-in-linux/index.html @@ -0,0 +1,2051 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Linux的硬链接和软链接 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + Linux的硬链接和软链接 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 1.4k阅读时长: 27 min +
+ +
+ + + 2016/08/02 + + + + +
+
+ +
+
+ + + + +
+
+
+

Linux下链接的命令是ln,可以通过man ln查看.

+ + +

硬链接

    +
  1. 链接的是索引节点(inode),硬链接文件inode值相同(在Linux的文件系统的文件不管是什么类型都给它分配一个indoe号),所以硬链接文件不占用磁盘空间.相当于创建一个别名;dentry是改变的(dentry包含文件名和inode等信息).
  2. +
  3. 有两个限制:目录不能创建硬链接;只能在同一个文件系统中进行硬链接.
  4. +
  5. 命令:
    ln srouce dest
  6. +
  7. 对源文件进行修改或删除,硬链接文件会同步修改.但删除硬链接的源文件,硬链接文件仍然存在.
  8. +
+

软链接

    +
  1. 软链接又称为符号链接,链接的是路径(path),链接文件中包含的是另一个文件的位置信息.
  2. +
  3. 可以是任意文件或者目录,可以链接不同文件系统的文件.
  4. +
  5. 可以链接不存在的文件,这种现象称为”断链”;也可以链接自己
  6. +
  7. 命令:
    ln -s srouce dest
    source最好用绝对路径表示,这样可以在任何目录下进行链接.若使用相对路径,如果当前的工作路径与要创建的符号链接文件所在路径不同,就不能进行链接.
  8. +
  9. 对源文件进行修改或删除,软链接文件会同步修改.
  10. +
+

缺点:

    +
  1. 因为链接文件中包含的是另一个文件的位置信息,所以当源文件从一个目录移到其它目录中,再访问链接文件,系统就找不到了.
  2. +
  3. 需要系统分配额外的空间用于建立新的索引节点和保存源文件的路径.
  4. +
+

理解

    +
  • 与windows类比
  • +
+
    +
  1. 硬链接类似复制,但与复制不同的是存在同步机制,一处的更改会同步到另一处,删除一处不会影响另一出.
  2. +
  3. 软链接相当于windows中的快捷方式.
  4. +
+
    +
  • 硬链接可以防止误删
    硬连接的作用是允许一个文件拥有多个有效路径名,因为多个硬链接文件指向同一个索引节点.这样用户就可以建立硬连接到重要文件,以防止“误删”的功能.只删除一个链接并不影响索引节点本身和其它的链接,只有当最后一个链接被删除后,文件的数据块及目录的链接才会被释放。也就是说,文件才会被真正删除。

    +
  • +
  • 硬链接的两个限制
    虽然系统有目录不能创建硬链接的限制,但是命令ln -d可以让超级用户对目录作硬连接,这说明系统限制对目录进行硬连接只是一个硬性规定,并不是逻辑上不允许或技术上的不可行。那么为什么要做出这个硬性规定呢?
    第一,如果引入了对目录的硬连接就有可能在目录中引入循环,那么在目录遍历的时候系统就会陷入无限循环当中。可是符号连接不也可以引入循环吗?因为在linux系统中,每个文件(目录也是文件)都对应着一个inode结构,其中inode数据结构中包含了文件类型(目录,普通文件,符号连接文件等等)的信息,也就是说操作系统在遍历目录时可以判断出符号连接,既然可以判断出符号连接当然就可以采取一些措施来防范进入过大的循环了,系统在连续遇到8个符号连接后就停止遍历,这就是为什么对目录符号连接不会进入死循环的原因了。但是对于硬连接,由于操作系统中采用的数据结构和算法限制,目前是不能防范这种死循环的。
    第二,文件的dentry结构主要包含了文件名,文件的inode号,指向父目录dentry结构的指针和其他一些指针,这里关键是那个指向父目录的指针;系统中所有的dentry结构都是按杂凑值存放在杂凑表中的,这里的杂凑算法很重要,它是取文件名和文件的父目录dentry结构的地址一起杂凑运算出杂凑值的。现在我们假设有两个目录 /a和/b,其中/b是我们通过ln -d命令建立起来的对/a的硬连接。这个时候内核空间中就会存在一个/a的dentry结构和一个/b的dentry结构,由上面的知识可知,/a和/b目录下面的每一个文件或目录都各自有对应的dentry结构(因为虽然/a目录下面的文件名没有改变,但是因为dentry结构有指向父目录dentry 的指针和计算杂凑值时考虑了父目录dentry结构的地址,这个时候dentry结构就分身乏术了),而且这种继承还会影响到所有子目录下面的文件,这样下来就会浪费很多系统空间了,特别是如果被硬连接的目录中存在大量文件和子目录的时候就更加明显了.

    +
  • +
+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2016/08/02/link-in-linux/ +

发表日期:2016/08/02 11:08

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 硬链接
  2. 2. 软链接
    1. 2.1. 缺点:
  3. 3. 理解
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2016/08/10/backup-of-blog-with-hexo-and-github/index.html b/2016/08/10/backup-of-blog-with-hexo-and-github/index.html new file mode 100644 index 000000000..0c1475d39 --- /dev/null +++ b/2016/08/10/backup-of-blog-with-hexo-and-github/index.html @@ -0,0 +1,2033 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Hexo+Github博客备份方法 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + Hexo+Github博客备份方法 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + + + + + +
+ + + + +
+ 字数统计: 273阅读时长: 5 min +
+ +
+ + + 2016/08/10 + + + + +
+
+ +
+
+ + + + +
+
+
+

使用hexo+github搭建的博客,博客作为一个单独的github仓库存在,可是仓库中不包含你每篇博客的源文件。如果你换了一台机器想要更新博客或者想重新发布以前的博客,这就不好办了。我这里推荐一种云端备份的方法。

+ + +

How

    +
  • 首先,在你博客的仓库中新开一个分支,作为backup(master为博客的推送分支),并且设为默认分支。
  • +
  • 将远程仓库获取到本地(两个仓库都需要获取)。
  • +
  • 每次写完博客之前,需要先获取更新:
    1
    $ git pull
  • +
  • 写完后,对backup分支进行备份:
    1
    2
    3
    $ git add .
    $ git commit -m "message"
    $ git push
  • +
  • 然后更新博客到master分支:
    1
    2
    3
    4
    5
    $ hexo n "postName" # hexo new 新建文章
    $ hexo g # hexo generate 生成静态页面至public目录
    $ hexo s # hexo server 开启预览访问端口(默认端口4000,'ctrl + c'关闭server)
    $ hexo d # hexo deploy #将.deploy目录部署到GitHub
    $ hexo clean
  • +
  • 最后将master分支的修改获取到本地:
    1
    $ git pull
  • +
+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2016/08/10/backup-of-blog-with-hexo-and-github/ +

发表日期:2016/08/10 21:08

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. How
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2016/09/05/empty-file-in-shell/index.html b/2016/09/05/empty-file-in-shell/index.html new file mode 100644 index 000000000..2d0913118 --- /dev/null +++ b/2016/09/05/empty-file-in-shell/index.html @@ -0,0 +1,2046 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Shell脚本清空文件的几种方法 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + Shell脚本清空文件的几种方法 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 242阅读时长: 5 min +
+ +
+ + + 2016/09/05 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文将介绍几种在Linux下清空文件的方法。

+ + +

Plan A

代码 :

+
1
2
3
#!/bin/bash
echo "" > $1
echo "$1 is cleaned up."
+

运行结果 :

+
1
2
3
4
5
6
7
8
9
10
11
$ cat test.txt
1
2
3
4
5
$ ./plana.sh test.txt
test.txt cleaned up.
$ cat test.txt


+ +
+

使用这个方法文件其实并没有真正被清空,而是有一个空行。

+
+

Plan B

代码 :

+
1
2
3
#!/bin/bash
: > $1
echo "$1 is cleaned up."
+ +

运行结果 :

+
1
2
3
4
5
6
7
8
9
10
11
$ cat test.txt
1
2
3
4
5
$ ./planb.sh test.txt
test.txt is cleaned up.
$ cat test.txt


+ +
+

是一个空命令,起到占位符的作用。这里被清空的文件不再有空行,实现真正意义的清空。

+
+

Plan C

代码 :

+
1
2
3
#!/bin/bash
cat /dev/null > $1
echo "$1 is cleaned up."
+

运行结果 :

+
1
2
3
4
5
6
7
8
9
10
$ cat test.txt
1
2
3
4
5
$ ./planc.sh test.txt
test.txt is cleaned up.
$ cat test.txt

+ +
+

/dev/null可以看作一个”黑洞”。所有写入它的内容都会丢失。从它那儿读取也什么都读不到。这里被清空的文件同样不再有空行,实现真正意义的清空。

+
+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2016/09/05/empty-file-in-shell/ +

发表日期:2016/09/05 11:09

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. Plan A
  2. 2. Plan B
  3. 3. Plan C
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2016/09/05/floating-point-operation-in-script/awk.png b/2016/09/05/floating-point-operation-in-script/awk.png new file mode 100644 index 000000000..b54036e65 Binary files /dev/null and b/2016/09/05/floating-point-operation-in-script/awk.png differ diff --git a/2016/09/05/floating-point-operation-in-script/bc.png b/2016/09/05/floating-point-operation-in-script/bc.png new file mode 100644 index 000000000..cce708dad Binary files /dev/null and b/2016/09/05/floating-point-operation-in-script/bc.png differ diff --git a/2016/09/05/floating-point-operation-in-script/index.html b/2016/09/05/floating-point-operation-in-script/index.html new file mode 100644 index 000000000..5f96f5756 --- /dev/null +++ b/2016/09/05/floating-point-operation-in-script/index.html @@ -0,0 +1,2045 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Shell脚本浮点运算 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + Shell脚本浮点运算 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 172阅读时长: 3 min +
+ +
+ + + 2016/09/05 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文将介绍几种Linux下通过Shell脚本进行浮点数计算的方法。

+ + +

Why

Bash Shell本身不具备处理浮点计算的能力, 如expr命令只支持整数运算 :

+
1
2
3
4
#!/bin/bash
a=59
b=60
expr $a / $b
+

运行结果 :

+
1
2
$ ./cal.sh
0
+ +

Plan A

使用bc进行处理。
代码 :

+
1
2
3
4
5
#!/bin/bash

a=59
b=60
echo "scale=4; $a / $b" | bc
+

运行结果 :

+
1
2
$ ./bc.sh
.9833
+
+

scale表示结果的小数精度。

+
+

Plan B

使用awk进行处理。
代码 :

+
1
2
3
4
#!/bin/bash
a=59
b=60
awk 'BEGIN{printf "%.2f\n",('$a'/'$b')}'
+ +

运行结果 :

+
1
2
$ ./awk.sh
0.98
+ + +

Compare

使用bc :
bc

+

使用awk :
awk

+
+

可以看出使用awk的效率更高,特别是运算次数比较大时。

+
+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2016/09/05/floating-point-operation-in-script/ +

发表日期:2016/09/05 14:09

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. Why
  2. 2. Plan A
  3. 3. Plan B
  4. 4. Compare
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2016/09/20/standard-of-headphone/headset.png b/2016/09/20/standard-of-headphone/headset.png new file mode 100644 index 000000000..cfec5d674 Binary files /dev/null and b/2016/09/20/standard-of-headphone/headset.png differ diff --git a/2016/09/20/standard-of-headphone/index.html b/2016/09/20/standard-of-headphone/index.html new file mode 100644 index 000000000..d403847bf --- /dev/null +++ b/2016/09/20/standard-of-headphone/index.html @@ -0,0 +1,2039 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + 科普|3.5mm耳机国标和美标 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + 科普|3.5mm耳机国标和美标 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 447阅读时长: 9 min +
+ +
+ + + 2016/09/20 + + + + +
+
+ +
+
+ + + + +
+
+
+

现在3.5mm规格的耳机已经普遍使用,但是用户会发现一些国外厂家的耳机并不适用国产手机,下面就为大家科普一下,解开这个迷题。

+ + +

区别

    +
  • 美标也称为国际标准(CTIA),从头开始分别是左声道/右声道/地线/MIC。目前在市场上最流行

    +
  • +
  • 国标(OMTP),从头开始分别是左声道/右声道/MIC/地线。

    +
  • +
+

headset

+

从上图可以发现美标和国标的差别就在于MIC和地线的位置不同,导致会出现在听音乐时只有伴奏没有人声,只有按住接听键才正常的现象。

+

另外一个区别是,美标的中间三节隔离绝缘圈,一般是都是白色的。而国标为了有所分别,一般是都是黑色的,大部分耳机可以通过此方法来区别。

+

适用范围

    +
  • 美标耳机适用手机范围:苹果(全系列)、小米(全系列)、魅族(全系列)、索尼(全系列)、LG(全系列)、HTC官方产品、三星(咨询客服)、摩托罗拉部分机型(ME865)、联想W101、诺基亚Lumia和WP7系列、华为(C8812/U9200)、亿通T900等。

    +
  • +
  • 国标耳机适用手机范围:诺基亚、索尼爱立信(全系列)、中兴(全系列)、步步高(全系列)、酷派(全系列)、HTC 非官方产品(A3380、A3360、T9188、A9188、Z510D)、三星旧产品(i8910、M3510C、M7500、F278、F700、F408、F490、G810、G818、G818E、i550W、8510、i560、S8000C、i8000、M2710C、i7500U、i9000、i6500U、F809、i8000、F859)、摩托罗拉XT531、联想A520/A750/P700、OPPO(全系列)等国产系列手机。

    +
  • +
+
+

若发现国标/美标不适配自己的手机,某宝上面有转接线可以买,可以通过转换国标/美标。

+
+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2016/09/20/standard-of-headphone/ +

发表日期:2016/09/20 11:09

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 区别
  2. 2. 适用范围
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2016/10/10/jq/index.html b/2016/10/10/jq/index.html new file mode 100644 index 000000000..bfbec19aa --- /dev/null +++ b/2016/10/10/jq/index.html @@ -0,0 +1,2040 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Linux下处理json数据 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + Linux下处理json数据 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 724阅读时长: 16 min +
+ +
+ + + 2016/10/10 + + + + +
+
+ +
+
+ + + + +
+
+
+

当我们在Linux下需要处理json数据时,第一反应是用脚本编写一个工具,这样即耗时又不通用. 本文将介绍专门的命令行json处理工具jq.

+ + +

安装

Ubuntu用户可以直接使用下列命令安装:

+
1
$ sudo apt-get install jq 
+

也可以选择源码安装,当然最简单的方法是直接下载可执行文件,不过需要找到适配你系统的版本.

+

详细的安装方法可以参考这里.

+

使用

首先构建一个基本的字符串作为示例 test.json:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"name": "中国",
"province": [{
"name": "黑龙江",
"cities": {
"city": ["哈尔滨", "大庆"]
}
}, {
"name": "广东",
"cities": {
"city": ["广州", "深圳", "珠海"]
}
}, {
"name": "台湾",
"cities": {
"city": ["台北", "高雄"]
}
}, {
"name": "新疆",
"cities": {
"city": ["乌鲁木齐"]
}
}]
}
+ +

解析json对象

1
2
3
4
5
6
7
8
9
10
11
$ cat test.json | jq '.name'
"中国"

$ cat test.json | jq '.province[0].name'
"黑龙江"

$ cat test.json | jq '.province[].name'
"黑龙江"
"广东"
"台湾"
"新疆"
+ +

提取字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
$ cat test.json | jq '.province[0]'
{
"cities": {
"city": [
"哈尔滨",
"大庆"
]
},
"name": "黑龙江"
}

$ cat test.json | jq '.province[]'
{
"cities": {
"city": [
"哈尔滨",
"大庆"
]
},
"name": "黑龙江"
}
{
"cities": {
"city": [
"广州",
"深圳",
"珠海"
]
},
"name": "广东"
}
{
"cities": {
"city": [
"台北",
"高雄"
]
},
"name": "台湾"
}
{
"cities": {
"city": [
"乌鲁木齐"
]
},
"name": "新疆"
}


$ cat test.json | jq '.province[0] | {name ,cities}'
{
"cities": {
"city": [
"哈尔滨",
"大庆"
]
},
"name": "黑龙江"
}

$ cat test.json | jq '.province[0] | {name}'
{
"name": "黑龙江"
}
+ +

内建函数

keys用来提取json中的key元素:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
$ cat test.json | jq 'keys'
[
"name",
"province"
]

$ cat test.json | jq '.|keys'
[
"name",
"province"
]

$ cat test.json | jq '.province[0]|keys'
[
"cities",
"name"
]

$ cat test.json | jq '.province[]|keys'
[
"cities",
"name"
]
[
"cities",
"name"
]
[
"cities",
"name"
]
[
"cities",
"name"
]
+ +

has用来判断是否存在某个key:

+
1
2
3
4
5
6
$ cat test.json | jq 'has("name")'
true
$ cat test.json | jq '.province[0] | has("name")'
true
$ cat test.json | jq 'has("noname")'
false
+ +

验证json

若json串格式错误的话,可以直接使用jq运行,会报出具体错误.

+

总结

有了这个工具.你就可以直接在命令行或者shell脚本对json数据进行操作了.

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2016/10/10/jq/ +

发表日期:2016/10/10 10:10

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 安装
  2. 2. 使用
    1. 2.1. 解析json对象
    2. 2.2. 提取字段
  3. 3. 内建函数
    1. 3.1. 验证json
  4. 4. 总结
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2016/10/10/use-dynamic-and-static-library/index.html b/2016/10/10/use-dynamic-and-static-library/index.html new file mode 100644 index 000000000..44541edd7 --- /dev/null +++ b/2016/10/10/use-dynamic-and-static-library/index.html @@ -0,0 +1,2091 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Linux下C调用静态库和动态库 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + Linux下C调用静态库和动态库 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 1.2k阅读时长: 26 min +
+ +
+ + + 2016/10/10 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文主要介绍Linux下C调用静态库和动态库,使用的样例文件请点击这里.

+ + +

样例文件

welcome.c:

+
1
2
3
4
5
6
7
#include<stdio.h>
#include"welcome.h"

void welcome()
{
printf("welcome to my code world!\n");
}
+
+

这是一个样例程序,打印一句话.

+
+

welcome.h:

+
1
2
3
4
5
6
#ifndef _WELCOME_H
#define _WELCOME_H

void welcome();

#endif
+
+

为上一个文件的声明.

+
+

概念

动态库和静态库二者的不同点在于代码被载入的时刻不同。

+

静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大。动态库(共享库)的代码在可执行程序运行时才载入内存,在编译过程中仅简单的引用,因此代码体积比较小。

+

静态情况下,把库直接加载到程序中,而动态库链接的时候,它只是保留接口,将动态库与程序代码独立,这样就可以提高代码的可复用度,和降低程序的耦合度。

+

静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在.

+

静态库

生成静态库文件:

+
1
2
$ gcc -Wall -O2 -fPIC -I./  -c -o welcome.o welcome.c
$ ar crv libwelcome.a welcome.o
+

ar命令的参数如下:

+
1
2
3
4
5
6
7
8
参数        意义
-r 将objfile文件插入静态库尾或者替换静态库中同名文件
-x 从静态库文件中抽取文件objfile
-t 打印静态库的成员文件列表
-d 从静态库中删除文件objfile
-s 重置静态库文件索引
-v 创建文件冗余信息
-c 创建静态库文件
+ +

test-sta.c:

+
1
2
3
4
5
6
7
8
#include<stdio.h>

int main(void)
{
welcome();

return 0;
}
+ +

编译:

+
1
$ gcc test-sta.c -o test-sta ./libwelcome.a
+

运行:

+
1
2
$ ./test-sta 
$ welcome to my code world!
+ + +

动态库

生成动态库文件:

+
1
2
3
4
$ gcc -o2 -fPIC -shared welcome.c -o libwelcome.so
or
$ gcc -o2 -fPIC -c welcome.c
$ gcc -shared -o libwelcome.so welcome.o
+

其中:
- fPIC : 产生与位置无关代码,全部使用相对地址.
- shared : 生成动态库.

+

编译时加载(隐式)

test-implicit.c:

+
1
2
3
4
5
6
7
8
#include<stdio.h>

int main()
{
welcome();

return 0;
}
+ +
+

和静态库一样,测试代码不需要包含导出函数的头文件.

+
+

编译:

+
1
$ gcc -o2 -Wall -L. -lwelcome test-implicit.c -o test-implicit
+ +

查看test-implicit动态段信息,发现已经依赖libwelcome.so:

+
1
2
3
4
5
6
7
8
$ ldd test-implicit 
linux-vdso.so.1 => (0x00007f0902951000)
libwelcome.so => ./libwelcome.so (0x00007f090274f000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003548600000)
libm.so.6 => /lib64/libm.so.6 (0x000000353de00000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003548200000)
libc.so.6 => /lib64/libc.so.6 (0x000000353da00000)
/lib64/ld-linux-x86-64.so.2 (0x000000353d600000)
+ +

若此时直接运行,会提示找不到动态库:

+
1
2
$ ./test-implicit
$ ./test-implicit: error while loading shared libraries: libwelcome.so: cannot open shared object file: No such file or directory
+

可以通过下列三种方法解决:

+
1
2
3
4
5
6
7
8
9
# 方法一 修改环境变量
$ export LD_LIBRARY_PATH=$(pwd):$LD_LIBRARY_PATH

# 方法二 将库文件链接到系统目录下
$ ln -s ./libwelcome.so /usr/lib

# 方法三 修改/etc/ld.so.conf
$ sudo echo $(pwd) >> /etc/ld.so.conf
$ sudo ldconfig
+

再次运行:

+
1
2
$ ./test-implicit
$ welcome to my code world!
+ +

运行时链接(显式)

test-explicit.c:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<stdio.h>
#include<dlfcn.h>

#define LIB "./libwelcome.so"

int main(void)
{
/*
* RTLD_NOW:将共享库中的所有函数加载到内存
* RTLD_LAZY:会推后共享库中的函数的加载操作,直到调用dlsym()时方加载某函数
*/

void *dl = dlopen(LIB,RTLD_LAZY); //打开动态库

if (dl == NULL)
fprintf(stderr,"Error:failed to load libary.\n");

char *error = dlerror(); //检测错误
if (error != NULL)
{
fprintf(stderr,"%s\n",error);
return -1;
}

void (*func)() = dlsym(dl,"welcome"); // 获取函数地址
error = dlerror(); //检测错误
if (error != NULL)
{
fprintf(stderr,"%s\n",error);
return -1;
}

func(); //调用动态库中的函数

dlclose(dl); //关闭动态库
error = dlerror(); //检测错误
if (error != NULL)
{
fprintf(stderr,"%s\n",error);
return -1;
}

return 0;
}
+

编译:

+
1
$ gcc  -ldl test-explicit.c -o test-explicit
+ +

查看test-explicit动态段信息,没有发现依赖libwelcome.so:

+
1
2
3
4
5
6
7
8
$ ldd test-explicit
linux-vdso.so.1 => (0x00007ffed89e5000)
libdl.so.2 => /lib64/libdl.so.2 (0x000000353e600000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003548600000)
libm.so.6 => /lib64/libm.so.6 (0x000000353de00000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003548200000)
libc.so.6 => /lib64/libc.so.6 (0x000000353da00000)
/lib64/ld-linux-x86-64.so.2 (0x000000353d600000)
+ +

运行:

+
1
2
$ ./test-explicit
$ welcome to my code world!
+ + +
+

区别: 隐式调用在编译可执行程序时需要指定库文件的搜索路径,而显式调用编译可执行程序时不用加上.

+
+

Reference

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2016/10/10/use-dynamic-and-static-library/ +

发表日期:2016/10/10 10:10

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 样例文件
  2. 2. 概念
  3. 3. 静态库
  4. 4. 动态库
    1. 4.1. 编译时加载(隐式)
    2. 4.2. 运行时链接(显式)
  5. 5. Reference
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2016/12/06/getw-and-putw/index.html b/2016/12/06/getw-and-putw/index.html new file mode 100644 index 000000000..8fbbab393 --- /dev/null +++ b/2016/12/06/getw-and-putw/index.html @@ -0,0 +1,2052 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + 从文件流中读写整数--C语言 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + 从文件流中读写整数--C语言 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 685阅读时长: 15 min +
+ +
+ + + 2016/12/06 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文将介绍在文本流中,读写整数的两个接口– int getw(FILE *fp)int putw(int w, FILE *fp),并且与你分享改进后的更实用的接口– unsigned int get_uint(FILE *fp)unsigned int put_uint(unsigned int i,FILE *fp).

+ + +

从文件流中读写整数–C语言

我们都知道,数据在计算机内存中都是以二进制的形式存储的,大多数PC的存储方式为小端存储,关于大小端字节序的讨论请参考阮一峰的理解字节序. 如果想直接读写整数,并不是很方便,这里就为你介绍两个接口,需要注意的是这两个接口非ANSI标准函数.

+

getw

函数原型:

+
1
int getw(FILE *fp);
+

函数功能:

+
1
从fp所指向文件读取下一个整数.
+

返回值:

+
1
返回输入的整数,如果文件结束或者出错返回-1.
+ +

putw

函数原型:

+
1
int putw(int w, FILE *fp);
+

函数功能:

+
1
将整型w写进fp指向的文件.
+

返回值:

+
1
返回输出的整数,如果出错,则返回EOF.
+ +

应用

代码:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
FILE *fp = NULL;
int num[2] = {-2147483648,2147483647};

fp = fopen("./log", "wb");
if (fp == NULL)
{
fprintf(stderr,"open file failed");
exit(EXIT_FAILURE);
}

putw(num[0],fp);
putw(num[1],fp);

fclose(fp);
fp = NULL;

fp = fopen("./log", "rb");
if (fp == NULL)
{
fprintf(stderr,"open file failed");
exit(EXIT_FAILURE);
}

printf("%d %d\n",getw(fp),getw(fp));

fclose(fp);
fp = NULL;

return 0;
}
+

结果为:

+
1
$ 2147483647 -2147483648
+
+

注意: 函数参数的压栈顺序是从左到右的,所以最后一个参数getw(fp)在栈顶,第一个出栈执行.

+
+

实现与改进(完整代码)

由于上述两个接口支持的是int型,所以取值范围为-2147483648~2147483647.(此文认为int型都为4个字节).笔者需要使用这两个接口去读写文件的大小,负数无用处的,所以决定改装一下这两个函数,顺便探究一下这个函数的实现:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
unsigned int get_uint(FILE *fp)
{
unsigned char *s;
unsigned int i;
s = (unsigned char *)&i;
s[0]=getc(fp);
printf("%x\n",s[0]);
s[1]=getc(fp);
printf("%x\n",s[1]);
s[2]=getc(fp);
printf("%x\n",s[2]);
s[3]=getc(fp);
printf("%x\n",s[3]);
return i;
}
+ +
1
2
3
4
5
6
7
8
9
10
11
12
13
14
unsigned int put_uint(unsigned int i,FILE *fp)
{
unsigned char *s;
s=(unsigned char *)&i;
putc(s[0],fp);
//printf("%x\n",s[0]);
putc(s[1],fp);
//printf("%x\n",s[1]);
putc(s[2],fp);
//printf("%x\n",s[2]);
putc(s[3],fp);
//printf("%x\n",s[3]);
return i;
}
+ +
+

改进后取值范围为0~4294967295.

+
+

同理,你也可以将这两个接口改为支持 long longunsigned long int等不同长度的整数类型.

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2016/12/06/getw-and-putw/ +

发表日期:2016/12/06 14:12

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 从文件流中读写整数–C语言
    1. 1.1. getw
    2. 1.2. putw
    3. 1.3. 应用
    4. 1.4. 实现与改进(完整代码)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2016/12/07/big-little-endian/big-little-endian.png b/2016/12/07/big-little-endian/big-little-endian.png new file mode 100644 index 000000000..b1884166d Binary files /dev/null and b/2016/12/07/big-little-endian/big-little-endian.png differ diff --git a/2016/12/07/big-little-endian/index.html b/2016/12/07/big-little-endian/index.html new file mode 100644 index 000000000..f19f53dd7 --- /dev/null +++ b/2016/12/07/big-little-endian/index.html @@ -0,0 +1,2037 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + C程序判断你主机的数据存储方式(大端和小端) · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + C程序判断你主机的数据存储方式(大端和小端) + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 624阅读时长: 13 min +
+ +
+ + + 2016/12/07 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文将使用C语言编写一个可以判断你主机数据存储方式(大端和小端)的程序.

+ + +

C程序判断你主机的数据存储方式(大端和小端)

大端和小端字节序

计算机硬件存储数据的方式有两种: 大端字节序(big endian) 和 小端字节序(little endian),两者的区别可以简单理解为:

+
    +
  • 大端: 数据高位字节放在内存低地址(人类读写的习惯).
  • +
  • 小端: 数据高位字节放在内存高地址.
  • +
+

如现在有数 0x1234,则两者存储方式如下:
大小端

+
+

既然大端字节序符合人类读写的习惯,那么为什么会有小端字节序呢?
因为大多数默认情况下计算机的电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。

+
+

当然并不是所有的计算机处理器都是小端模式的,目前IBM和Freescale的一些处理器以及一些常见的单片机芯片等都是采用大端字节序存储数据.而市面上大部分CPU则是采用小端字节序,如intel等.

+

实现(完整代码)

本例都认为short占2个字节,不考虑可移植的情况.

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <stdlib.h>

union _byteorder
{
short s;
char c[2];
};

int main(void)
{
union _byteorder un;

un.s = 0x0102;

if(sizeof(short) == 2)
{
if(un.c[0] == 2 && un.c[1] == 1)
printf("little-endian\n");
else if(un.c[0] == 1 && un.c[1] == 2)
printf("big-endian\n");
else
fprintf(stderr,"Error:can not judge host byte order.\n");
}
else
printf("sizeof(short) = %ld\n",sizeof(short));

exit(EXIT_SUCCESS);
}
+

这里利用了union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员的特性.
首先分配了一个占2个字节的内存空间(union分配的空间需要容纳最大长度的数据成员),将0x0102赋予short型变量.
然后利用char数组,按一个字节的长度依次取出数据,然后利用上节介绍的大小端存储方式的不同进行判断.

+

Reference

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2016/12/07/big-little-endian/ +

发表日期:2016/12/07 11:12

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. C程序判断你主机的数据存储方式(大端和小端)
    1. 1.1. 大端和小端字节序
    2. 1.2. 实现(完整代码)
  2. 2. Reference
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2017/02/23/listen-in-unix/index.html b/2017/02/23/listen-in-unix/index.html new file mode 100644 index 000000000..26157ff9b --- /dev/null +++ b/2017/02/23/listen-in-unix/index.html @@ -0,0 +1,2038 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + UNIX网络编程-listen函数及其包裹函数介绍 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + UNIX网络编程-listen函数及其包裹函数介绍 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + + + +
+ + + + +
+ 字数统计: 411阅读时长: 8 min +
+ +
+ + + 2017/02/23 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文将介绍UNIX网络编程中listen函数及其包裹函数。

+ + +

函数简介

1
2
3
4
#include<sys/socket.h>

int listen(int sockfd,int backlog);
返回:若成功则为0,若出错则为-1
+

目前listen函数仅为TCP服务器调用,主要完成两个任务:

+
    +
  1. socket函数创建的还未建立连接的主动套接字转换为被动(监听)套接字,使内核接受指向该套接字的连接。
  2. +
  3. 使用第二个参数规定了内核为相应套接字排队的最大连接个数。
  4. +
+
+

tips:socket函数创建的套接字被默认为一个主动套接字,即该套接字为将调用connect函数发起连接的客户套接字。而listen函数导致该套接字从CLOSED状态转换为LISTEN状态。

+
+

包裹函数(下载)

历史上总是将backlog设为5,但已无法满足现在服务器的需求了,所以需要指定一个较大的backlog才能满足繁忙的需求。一种方法是使用一个常值,可是每次增长都需要重新编译,比较麻烦;另一种方法是设定默认值,然后允许通过命令行或环境变量覆盖默认值:

+
1
2
3
4
5
6
7
8
9
10
11
12
#include<stdlib.h>
#include<sys/socket.h>

void Listen(int fd,int backlog)
{
char *ptr;
if((ptr = getenv("LISTENQ")) != NULL)
backlog = atoi(ptr);

if(listen(fd,backlog) == -1)
perror("Listen error");
}
+

这样就可以通过设置环境变量LISTENQ来动态配置backlog的大小。

+
+

tips:backlog为0不代表就不会有客户连接到你的机器。如果不想让客户连接,请直接关闭该套接字。

+
+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2017/02/23/listen-in-unix/ +

发表日期:2017/02/23 17:02

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 函数简介
  2. 2. 包裹函数(下载)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2017/03/23/introduction-to-four-service-of-cloud-computing/Introduction-to-four-service-of-cloud-computing.jpg b/2017/03/23/introduction-to-four-service-of-cloud-computing/Introduction-to-four-service-of-cloud-computing.jpg new file mode 100644 index 000000000..934d7269f Binary files /dev/null and b/2017/03/23/introduction-to-four-service-of-cloud-computing/Introduction-to-four-service-of-cloud-computing.jpg differ diff --git a/2017/03/23/introduction-to-four-service-of-cloud-computing/index.html b/2017/03/23/introduction-to-four-service-of-cloud-computing/index.html new file mode 100644 index 000000000..a5eb16013 --- /dev/null +++ b/2017/03/23/introduction-to-four-service-of-cloud-computing/index.html @@ -0,0 +1,2037 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + 科普|云计算的四种服务模式介绍 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + 科普|云计算的四种服务模式介绍 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 459阅读时长: 9 min +
+ +
+ + + 2017/03/23 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文将介绍SaaSBaaSPaaSIaaS这四种云计算服务模式,并分析之间的联系和区别。

+ + +

四种服务模式介绍

    +
  • SaaS(Software as a Service):软件即服务,SaaS公司提供完整并可直接使用的应用程序,用户通过网页浏览器即可接入使用。比较知名的SaaSGoToMeetingWebExSalesforce
  • +
  • BaaS(Backend as a Service):后端即服务,为移动应用开发者提供后端云服务,包括云端数据存储、账户管理和消息推送等,简化了应用开发流程。这里推荐一篇对BaaS介绍的文章
  • +
  • PaaS(Platform as a Service):平台即服务,也被叫做中间件。用户通过Internet可以使用PaaS公司在网上提供的各种开发和分发应用的解决方案,比如虚拟服务器和操作系统等,软件的开发和运行都可以在提供的平台上进行。不仅节约了硬件成本,更大大提高了协作开发的效率。比较知名的PaaSGoogle App EngineMicrosoft AzureAppFog
  • +
  • IaaS(Infrastructure as a Service):基础设施即服务,用户通过租用IaaS公司的服务器,存储和网络硬件,利用Internet就可以完善地获取计算机基础设施服务,大大节约了硬件成本。比较知名的IaaSAmazonMicrosoftAliyun等。
  • +
+

四种服务模式的关系

    +
  • PaaS构建在IaaS之上,在基础架构之外还提供了业务软件的运行环境。
  • +
  • SaaSPaaS的区别在于,使用SaaS的不是软件的开发人员,而是软件的最终用户。
  • +
  • BaaS属于PaaS的范畴,但两者也有区别。BaaS简化了应用开发流程,而PaaS简化了应用部署流程。
  • +
+

云计算的四种服务模式介绍

+

Reference

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2017/03/23/introduction-to-four-service-of-cloud-computing/ +

发表日期:2017/03/23 14:03

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 四种服务模式介绍
  2. 2. 四种服务模式的关系
  3. 3. Reference
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2017/06/16/table-encode-as-array-or-object/index.html b/2017/06/16/table-encode-as-array-or-object/index.html new file mode 100644 index 000000000..46f5673b6 --- /dev/null +++ b/2017/06/16/table-encode-as-array-or-object/index.html @@ -0,0 +1,2045 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + 记一次踩坑|空table应该编码为数组还是对象 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + 记一次踩坑|空table应该编码为数组还是对象 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 389阅读时长: 8 min +
+ +
+ + + 2017/06/16 + + + + +
+
+ +
+
+ + + + +
+
+
+

Json有两种比较常用的数据类型:被{}包裹的对象(object),被[]包裹的数组(array

+ + +

问题描述

从第三方API返回的json数据,存在一个key的值为空数组,可是经过decodeencode这两步操作后,这个key的值就变为空对象了:

+
1
2
3
4
5
6
7
local cjson = require('cjson')

local raw = {}
raw.name = 'answer'
raw.list = {}
local str = cjson.encode(raw)
print('after cjson encode:', str)
+ +

输出:

+
1
after cjson encode:	{"name":"answer","list":{}}
+

cjson对于空的table,会默认处理为object,对于Lua本身,是无法区分空数组和空字典的(数组和字典融合到一起了),但是对于强类型语言(C/C++, Java等),这时候就会出现问题,必须作容错处理

+

解决方法

使用encode_empty_table_as_object方法

1
2
3
4
5
6
7
8
local cjson = require('cjson')

local raw = {}
raw.name = 'answer'
raw.list = {}
cjson.encode_empty_table_as_object(false)
local str = cjson.encode(raw)
print('after cjson encode:', str)
+

输出:

+
1
after cjson encode:	{"name":"answer","list":[]}
+ +

更换dkjson

1
2
3
4
5
6
7
local dkjson = require('dkjson')

local raw = {}
raw.name = 'answer'
raw.list = {}
local str = dkjson.encode(raw)
print('after cjson encode:', str)
+

输出:

+
1
after cjson encode:	{"name":"answer","list":[]}
+ +

使用metatabletable标记为array

1
2
3
4
5
6
7
8
local cjson = require('cjson')

local raw = {}
raw.name = 'answer'
raw.list = {}
setmetatable(raw.list, cjson.empty_array_mt)
local str = cjson.encode(raw)
print('after cjson encode:', str)
+ +

输出:

+
1
after cjson encode:	{"name":"answer","list":[]}
+ +

Reference

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2017/06/16/table-encode-as-array-or-object/ +

发表日期:2017/06/16 15:06

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 问题描述
  2. 2. 解决方法
    1. 2.1. 使用encode_empty_table_as_object方法
    2. 2.2. 更换dkjson库
    3. 2.3. 使用metatable将table标记为array
  3. 3. Reference
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2017/06/20/note-of-openresty-study/index.html b/2017/06/20/note-of-openresty-study/index.html new file mode 100644 index 000000000..98861457f --- /dev/null +++ b/2017/06/20/note-of-openresty-study/index.html @@ -0,0 +1,2064 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + 笔记 | OpenResty系列课程 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + 笔记 | OpenResty系列课程 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 782阅读时长: 16 min +
+ +
+ + + 2017/06/20 + + + + +
+
+ +
+
+ + + + +
+
+
+

观看OpenResty 系列课程的学习笔记

+ + +

用 OpenResty 快乐的搭建高性能服务端

1.1 OpenResty简介

高性能服务端的两个特点:

+
    +
  • 缓存(内存>SSD>机械磁盘,本机>网络,进程内>进程外)
  • +
  • 异步非阻塞(事件驱动)
  • +
+

1.2 hello world

参考资料:

+ +

OpenResty = Nginx + LuaJIT(LuaJIT虚拟机嵌在Nginx worker中)

+

lua_code_cachelua代码缓存,默认开启,支持set_by_lua_filecontent_by_lua_file等指令和lua模块,关闭后方便开发(不用重启Nginx),生产环境建议开启(影响性能)

+

content_by_lua_file:指定要执行的lua文件

+

1.3 OpenResty入门

书籍:openresty最佳实践

+

运行时的错误日志保存在logs/error.log

+

nginx.conf示例片段:

+
1
2
3
 location = /api/random {
content_by_lua_file lua/random.lua;
}
+

random.lua

+
1
2
3
4
5
6
7
8
local args = ngx.req.get_uri_args() --max is 100,set 0 to unlimit
local salt = args.salt
if not salt then
ngx.exit(ngx.HTTP_BAD_REQUEST)
end

local string = ngx.md5(ngx.time() .. salt)
ngx.say(string)
+ +

1.4 ngx lua API介绍

+

Tips: 不要使用 lua API(阻塞),要用ngx lua API(非阻塞)

+
+

1.5 连接数据库

+

Tips: 数据库操作的代码逻辑看上去是同步的,但是内部实现是异步的

+
+

主要有lua-resty-redislua-resty-mysql

+

1.6 OpenResty缓存

    +
  • share_dict: 字典缓存,纯内存缓存,可以预设内存大小,多个worker共享,需要锁操作
  • +
  • lua-resty-lrucache:可以预设key个数,单个worker使用,内存使用翻倍
  • +
+

缓存失效风暴:在缓存超时时间触发的瞬间,所有的并发请求都同时执行数据库查询操作,数据库压力瞬间变大,下次请求又全部进入缓存,压力瞬间变小,出现两个极值。可以使用lua-resty-lock对数据库查询操作加锁,使数据库查询只进行一次

+

1.7 FFI和第三方模块

FFILuaJIT的一个库,可以在LuaJIT中调用C的数据结构和外部C函数。如random.lua
第三方模块:放在/openresty/lualib/resty目录下。

+

1.8 子查询

ngx.location.capturengx.location.capture_multi:在一个location内部,对另一个location进行请求,因为这不是http请求,是C级别的调用,所以有开销小的优点; 同时可以降级服务(某一个非关键服务down掉,可以继续使用),开放给前端就一个api接口即可,在这个api接口内做多个子查询,不需要前端调用多个api进行查询,避免由于某一个api服务挂掉而导致阻塞

+
1
2
3
4
5
6
7
8
9
10
11
12
location = /api/test_parallels {
content_by_lua_block {
local start_time = ngx.now()
local res1, res2 = ngx.location.capture_multi({
{"/sum",{args={a=3, b=8}}},
{"/subduction",{args={a=3, b=8}}},
})
ngx.say("status:", res1.status, "response:", res1.body)
ngx.say("status:", res2.status, "response:", res2.body)
ngx.say("time used:", ngx.now()-start_time)
}
}
+ +

1.9 执行阶段

这个是NginxOpenResty独有的概念,不同的阶段有不同的处理行为,可参考执行阶段概念

+

常用命令

更改conf后,检查conf文件是否正确:nginx -t -c [conf]
重启:nginx:nginx -s reload -p [path]

+

Reference

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2017/06/20/note-of-openresty-study/ +

发表日期:2017/06/20 17:06

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 用 OpenResty 快乐的搭建高性能服务端
    1. 1.1. 1.1 OpenResty简介
    2. 1.2. 1.2 hello world
    3. 1.3. 1.3 OpenResty入门
    4. 1.4. 1.4 ngx lua API介绍
    5. 1.5. 1.5 连接数据库
    6. 1.6. 1.6 OpenResty缓存
    7. 1.7. 1.7 FFI和第三方模块
    8. 1.8. 1.8 子查询
    9. 1.9. 1.9 执行阶段
  2. 2. 常用命令
  3. 3. Reference
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2017/06/27/io-model/asyn-io.png b/2017/06/27/io-model/asyn-io.png new file mode 100644 index 000000000..6c75b716e Binary files /dev/null and b/2017/06/27/io-model/asyn-io.png differ diff --git a/2017/06/27/io-model/blocking-io.png b/2017/06/27/io-model/blocking-io.png new file mode 100644 index 000000000..4b5bfe259 Binary files /dev/null and b/2017/06/27/io-model/blocking-io.png differ diff --git a/2017/06/27/io-model/compare-io.png b/2017/06/27/io-model/compare-io.png new file mode 100644 index 000000000..4a505c56f Binary files /dev/null and b/2017/06/27/io-model/compare-io.png differ diff --git a/2017/06/27/io-model/index.html b/2017/06/27/io-model/index.html new file mode 100644 index 000000000..d1fc7a5d8 --- /dev/null +++ b/2017/06/27/io-model/index.html @@ -0,0 +1,2063 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + UNIX下IO模型分析 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + UNIX下IO模型分析 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 1.3k阅读时长: 25 min +
+ +
+ + + 2017/06/27 + + + + +
+
+ +
+
+ + + + +
+
+
+

UNIX下的五种常见IO模型分析,帮助理解

+ + +

IO操作的两个阶段

以读数据操作为例:

+
    +
  1. 等待内核数据准备(数据拷贝到内核缓冲区)
  2. +
  3. 将数据从内核拷贝到用户空间
  4. +
+

IO模型

UNIX下共有五种常见的IO模型:
UNIX下共有五种常见的IO模型

+

下面以recvfrom接口举例

+

阻塞IO

默认情况下,所有的套接字都是阻塞的
阻塞IO
调用recvfrom接口,进程在IO操作的两个阶段都会阻塞,直到最终数据拷贝到用户空间或者过程中出现错误才会返回,进程在阻塞状态下是不占用CPU资源的

+
+

最常见的错误是发生系统中断,此时需要重读,可参考这里

+
+

非阻塞IO

可以通过fcntl(sockfd,F_SETFL,O_NONBLOCK)将套接字设置成非阻塞
非阻塞IO
调用recvfrom接口,无论内核缓冲区是否有可用数据,进程都会立即返回,所以在IO操作的第一阶段是非阻塞的; 若无数据可用,内核将errno设置为为EWOULDBLOCK或者EAGAIN,进程可以使用轮询的方法,保证内核在数据准备好时,能立即拷贝到用户空间; 若有则立即将数据拷贝到用户空间,进程在数据拷贝到用户空间即IO操作的第二阶段是阻塞的;

+
+

非阻塞IO过于消耗CPU时间,将大部分时间用于轮询

+
+

多路复用IO

多路复用系统调用:select,pollepoll,其中windows平台不支持pollepoll,使用方法可以参考I/O 多路复用之select、poll、epoll详解Linux select/poll和epoll实现机制对比
 多路复用IO
调用select,等待内核数据准备,所以IO操作的第一个阶段,进程是阻塞的,不过是阻塞在多路复用系统调用上,而不是IO系统调用上; 当select返回套接字可读条件时,再调用recvfrom将数据从内核拷贝到用户空间,IO操作的第二阶段,进程是阻塞的

+

多路复用IO和阻塞IO,在IO操作的两个阶段都是阻塞的,不过多路复用IO使用了两个系统调用,而阻塞IO只使用了一个,所以在连接数不是很多的情况下,阻塞IO可能性能更佳; 多路复用IO的优势在于可以同时监控多个用于IO的文件描述符。

+
+

多线程中的阻塞IO,与多路复用IO极为相似

+
+

信号驱动IO

信号驱动IO
调用sigaction等系统调用安装信号处理函数,并立即返回,所以IO操作的第一阶段,进程是非阻塞的; 当内核数据准备好时,内核会产生一个信号,通知进程将数据从内核拷贝到用户空间,IO操作的第二阶段,进程是阻塞的

+
+

使用方法:IO的多路复用和信号驱动

+
+

异步IO

异步IO有一组以aio开头的系统调用,使用方法可参考Linux AIO机制
异步IO
调用异步IO系统调用,给内核传递描述字、缓冲区指针、缓冲区大小(与read相同的三个参数)、文件偏移(与lseek类似),告诉内核当整个操作完成时如何通知我们,并立即返回,在IO操作的两个阶段,进程都不阻塞

+

总结

5种IO模式比较

+
    +
  • 同步IO和异步IO的主要区别是将数据从内核拷贝到用户空间是否阻塞,前者会在将数据从内核拷贝到用户空间时即IO操作的第二个阶段发生阻塞,而后者则在系统调用后直接返回,直到内核发送信号通知IO操作完成,在IO操作的两个阶段都没有阻塞
  • +
  • 阻塞IO和非阻塞IO的主要区别是系统调用是否立即返回(默认将数据从内核拷贝到用户空间即IO操作的第二个阶段是立即返回的),前者会在IO操作的两个阶段完成前一直阻塞,后者在内核没有准备好数据的情况下立即返回,即只会在IO操作的第二个阶段阻塞
  • +
  • 信号驱动IO和异步IO的主要区别在于前者由内核通知我们何时启动一个IO操作,在将数据从内核拷贝到用户空间过程中即IO操作的第一个阶段依旧是阻塞的,而后者是由内核通知我们IO操作何时完成,在IO操作的两个阶段都没有阻塞
  • +
+
+

知乎上有一个比较生动的例子可以说明这几种模型之间的关系。

+
+

Reference

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2017/06/27/io-model/ +

发表日期:2017/06/27 16:06

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. IO操作的两个阶段
  2. 2. IO模型
    1. 2.1. 阻塞IO
    2. 2.2. 非阻塞IO
    3. 2.3. 多路复用IO
    4. 2.4. 信号驱动IO
    5. 2.5. 异步IO
  3. 3. 总结
  4. 4. Reference
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2017/06/27/io-model/io-model.png b/2017/06/27/io-model/io-model.png new file mode 100644 index 000000000..1684c6b03 Binary files /dev/null and b/2017/06/27/io-model/io-model.png differ diff --git a/2017/06/27/io-model/multi-io.png b/2017/06/27/io-model/multi-io.png new file mode 100644 index 000000000..11ab9e404 Binary files /dev/null and b/2017/06/27/io-model/multi-io.png differ diff --git a/2017/06/27/io-model/no-blocking-io.png b/2017/06/27/io-model/no-blocking-io.png new file mode 100644 index 000000000..3a60df013 Binary files /dev/null and b/2017/06/27/io-model/no-blocking-io.png differ diff --git a/2017/06/27/io-model/signal-io.png b/2017/06/27/io-model/signal-io.png new file mode 100644 index 000000000..4a64ccaf4 Binary files /dev/null and b/2017/06/27/io-model/signal-io.png differ diff --git a/2017/08/04/gcc-compilation-of-arm-articles/index.html b/2017/08/04/gcc-compilation-of-arm-articles/index.html new file mode 100644 index 000000000..2156ba086 --- /dev/null +++ b/2017/08/04/gcc-compilation-of-arm-articles/index.html @@ -0,0 +1,2045 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + GCC编译ARM篇 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + GCC编译ARM篇 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 393阅读时长: 8 min +
+ +
+ + + 2017/08/04 + + + + +
+
+ +
+
+ + + + +
+
+
+

ARM 平台下GCC编译相关介绍,待补充

+ + +

ARM处理器架构

ARM处理器架构,通过选项-march指定,如-march=armv7-a,常见的有

+
    +
  1. armv5te
    arm9系列使用该架构
  2. +
  3. armv6
    arm11系列使用该架构
  4. +
  5. armv7-a
    cortex-a系列使用该架构,如cortex-a5、a7、a8、a9、a12、a15
  6. +
  7. armv8
    cortex-a系列使用该架构,如cortex-a53、a57、a72
  8. +
+

指令集

指令集,通过选项-m指定,如-mthumb,常见的有

+
    +
  1. thumb
    16位指令集,它将32位arm指令的压缩成16位的指令编码方式,节省代码存储空间,实现低功耗
  2. +
  3. thumb-2
    16位/32位指令集,对thumb指令集进行了扩充,增加了一些32位指令,改善thumb指令集的性能
  4. +
  5. arm
    32位指令集, 兼容所有arm架构,性能高
  6. +
+

浮点类型

浮点运算的类型,通过选项-mfloat-abi指定,如-mfloat-abi=hard,有三种类型

+
    +
  1. soft
    使用软浮点库进行浮点运算,不使用硬浮点单元,适用于不含FPUCPU
  2. +
  3. softfp
    使用硬浮点单元进行浮点运算,生成硬浮点指令,调用接口的规则和soft兼容
  4. +
  5. hard
    使用硬浮点单元进行浮点运算,生成硬浮点指令,与softfp的区别在于调用接口的规则不同
  6. +
+

硬浮点指令的类型,通过选项-mfpu指定,如-mfpu=neon,常用的有两种

+
    +
  1. vfp
    其中vfpv2应用于armv5te, armv6架构中的浮点计算指令集,vfpv3vfpv4应用于部分armv7a架构中的浮点计算指令集
  2. +
  3. neon
    应用于cortex-a系列处理器,性能好
  4. +
+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2017/08/04/gcc-compilation-of-arm-articles/ +

发表日期:2017/08/04 16:08

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. ARM处理器架构
  2. 2. 指令集
  3. 3. 浮点类型
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2017/12/15/condition-variables-of-thread-synchronization/index.html b/2017/12/15/condition-variables-of-thread-synchronization/index.html new file mode 100644 index 000000000..429429f71 --- /dev/null +++ b/2017/12/15/condition-variables-of-thread-synchronization/index.html @@ -0,0 +1,2078 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + 线程同步机制条件变量的使用与思考 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + 线程同步机制条件变量的使用与思考 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 976阅读时长: 20 min +
+ +
+ + + 2017/12/15 + + + + +
+
+ +
+
+ + + + +
+
+
+

条件变量是Linux线程同步的一种机制,与互斥量一起使用时,允许线程以无竞争的方式等待特定条件的发生

+ + +

[TOC]

+

关键函数

初始化与注销

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <pthread.h>

// 静态初始化
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

// 动态初始化
int pthread_cond_init(thread_cond_t *cond,
const pthread_condattr_t *attr);

// 反初始化,即注销
int pthread_cond_destroy(pthread_cond_t *cond);

返回值: 若成功,返回0;否则,返回错误编码
+

注意:

+
    +
  • 只有在没有线程在该条件变量上等待时,才可以注销条件变量,否则会返回EBUSY
  • +
  • Linux在实现条件变量时,并没有为条件变量分配资源,所以在注销一个条件变量时,只需要注意该变量是否仍有等待线程即可
  • +
+

线程等待

1
2
3
4
5
6
7
8
9
10
#include <pthread.h>

int pthread_cond_wait(pthread_cond_t *cond,
pthread_mutex_t *mutex);

int pthread_cond_timedwait(pthread_cond_t *cond,
pthread_mutex_t *mutex,
const struct timespec *abstime);

返回值: 若成功,返回0;否则,返回错误编码
+

执行过程如下:

+
    +
  1. 调用者把锁住的互斥量传给函数,然后函数自动把调用线程放到等待条件的线程列表上
  2. +
  3. 对互斥量进行解锁,线程挂起进入等待(不占用CPU时间) 
  4. +
  5. 函数被唤醒返回时,会自动对互斥量进行加锁
  6. +
+
+

pthread_cond_timedwait只是多了一个等待超时时间,通过timespec指定,超时返回错误ETIMEDOUT

+
+

线程唤醒

1
2
3
4
5
6
7
#include <pthread.h>

int pthread_cond_signal(pthread_cond_t *cond);

int pthread_cond_broadcast(pthread_cond_t *cond);

返回值: 若成功,返回0;否则,返回错误编码
+
    +
  • pthread_cond_signal至少能唤醒一个等待该条件的线程
  • +
  • pthread_cond_broadcast则能唤醒等待该条件的所有线程
    +

    需要注意的是,一定要在改变条件状态以后再给线程发信号

    +
    +
  • +
+

示例

示例代码可参考我的github,由于篇幅原因,不在此贴出

+

一些思考

条件变量实质是什么

条件变量实质是利用线程间共享的全局变量进行同步的一种机制

+

互斥量保护的是什么

示例中的相关代码

+
1
2
3
4
5
6
7
8
pthread_mutex_lock(&(test->mut));

while (test->condition == 0)
{
pthread_cond_wait(&(test->cond), &(test->mut));
}

pthread_mutex_unlock(&(test->mut));
+

互斥量是用来保护条件test->condition在读取时,它的值不被其它线程修改,如果条件成立,则此线程进入等待条件的线程队列,对互斥量进行解锁并开始等待

+

为什么用while来判断条件

如上面的代码所示,使用while对条件进行判断的原因如下:

+
    +
  1. 若先解锁互斥量,再唤醒等待线程,则条件可能被其它线程更改,使得等待条件再次成立,需要继续等待
  2. +
  3. pthread_cond_wait可能存在意外返回的情况,则此时条件并没有被更改,需要继续等待。
    +

    造成意外返回的原因是Linux中带阻塞功能的系统调用都会在进程收到signal后返回

    +
    +
  4. +
+

先唤醒线程还是先解锁

示例代码:

+
    +
  1. 情况一:先唤醒

    +
    1
    2
    3
    4
    pthread_mutex_lock(&(test->mut));
    test->condition = 1
    pthread_cond_signal(&(test->cond));
    pthread_mutex_unlock(&(test->mut));
    +
  2. +
  3. 情况二:先解锁

    +
    1
    2
    3
    4
    pthread_mutex_lock(&(test->mut));
    test->condition = 1
    pthread_mutex_unlock(&(test->mut));
    pthread_cond_signal(&(test->cond));
    +

    两种情况各有缺点:

    +
  4. +
+
    +
  • 情况一在唤醒等待线程后,再解锁,使得等待线程在被唤醒后试图对互斥量进行加锁时,互斥量还未解锁,则线程又进入睡眠,待互斥量解锁成功后,再次被唤醒并对互斥量加锁,这样就会发生两次上下文切换,影响性能
  • +
  • 情况二在唤醒等待线程前先解锁,使得其它线程可能先于等待线程获取互斥量,并对条件进行更改,使得条件变量失去作用
  • +
+

Reference

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2017/12/15/condition-variables-of-thread-synchronization/ +

发表日期:2017/12/15 22:12

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 关键函数
    1. 1.1. 初始化与注销
    2. 1.2. 线程等待
    3. 1.3. 线程唤醒
  2. 2. 示例
  3. 3. 一些思考
    1. 3.1. 条件变量实质是什么
    2. 3.2. 互斥量保护的是什么
    3. 3.3. 为什么用while来判断条件
    4. 3.4. 先唤醒线程还是先解锁
  4. 4. Reference
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2017/12/29/speex/aec.png b/2017/12/29/speex/aec.png new file mode 100644 index 000000000..95b61ae27 Binary files /dev/null and b/2017/12/29/speex/aec.png differ diff --git a/2017/12/29/speex/index.html b/2017/12/29/speex/index.html new file mode 100644 index 000000000..08cab560f --- /dev/null +++ b/2017/12/29/speex/index.html @@ -0,0 +1,2084 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Speex介绍 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + Speex介绍 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 1.7k阅读时长: 34 min +
+ +
+ + + 2017/12/29 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文将对Speex相关的概念进行介绍

+ + +

[TOC]

+

Speex编解码器是一款开源且免费的语音编解码器,遵循BSD协议,为分封网络(packet network)和网络电话(VoIP)而设计,支持文件的压缩

+
+

为网络电话而不是移动电话而设计,意味着Speex对数据丢失具有鲁棒性,但是对数据包损坏不鲁棒,在VoIP中的数据包要么完整到达,要么不能到达

+
+

Speex选用CELP(码激励线性预测编码)编码技术,在高比特率和低比特率都稳定可靠,复杂性适度并且占用内存较少

+

相关概念

采样率

采样率是每秒钟采集到的信号样本数,单位是HertzHz),Speex为三种不同的采样率而设计:8kHz(窄带),16kHz(宽带)和32kHz(超宽带)

+

比特率

在对语音信号编码时,比特率定义为单位时间内的比特数,单位是比特每秒(bps)或通常的千比特每秒(kbps

+
+

注意千比特每秒(kbps)和千字节每秒(kBps)的区别。

+
+

质量(可变)

Speex是有损的编解码器,意味着压缩率以输入语音信号的保真度为代价,质量越高,压缩后的比特率越大,音质也越好
Speex可以控制质量和比特率之间的折中,大多数时间由一个范围在010之间的质量参数控制

+
+

在不变比特率(CBR)中,质量参数是一个整数; 在可变比特率(VBR)中,质量参数是一个浮点数。

+
+

复杂度(可变)

Speex允许编码器拥有可变的复杂度,通过一个范围在110之间的整数控制搜索的执行来实现,复杂度越高,压缩率越高,CPU使用率越高,音质越好,类似于gzipbzip2压缩工具的-1到*-9选项
正常使用情况下,复杂度为
1的噪声等级比复杂度为10的噪声等级高12dB,但复杂度为10CPU要求比复杂度为1的高5*倍。

+
+

实际应用中,最好的折中是复杂度24,但在编码非语音声音如DTMF声调时更高的复杂度经常被用到

+
+

可变比特率(VBR

可变比特率(VBR)允许编解码器自适应的根据待编码音频的“难度”动态地改变比特率,如元音和高能瞬态变化的声音需要高比特率以获得好的质量; 但是摩擦音(如s,f)用低比特率就能充分编码

+
    +
  • 优点:VBR在相同的质量下能获得更低的比特率,或在不变比特率下获得更好的质量
  • +
  • 缺点:在指定质量情况下,无法保证最终的平均比特率;在一些如网络电话(VoIP)这样的实时应用中,依赖于最大比特率,这在通信信道中必须足够低。
  • +
+

平均比特率(ABR

平均比特率解决了VBR中的一个问题,它动态地调整VBR质量以获得指定的比特率,因为质量和比特率是实时调整的,ABR的全局质量比正好达到目标平均比特率的VBR编码质量稍微差些。

+

声音活动检测(VAD

VAD检测待编码的音频是语音还是无声/背景噪声,VBR编码中默认激活

+
+

Speex检测出非语言段并仅使用足够复现背景噪声的比特率进行编码,这叫“柔化噪音生成”(CNG)。

+
+

断续传输(DTX)

断续传输是VAD/VBR的附加操作,当背景噪声平稳时会完全停止传输

+

知觉增强

知觉增强是解码器的一部分,当被启用时,能减少编解码过程中产生的噪声或失真的知觉

+
+

在大多数情况下,知觉增强会带来声音客观上的偏离(如仅考虑SNR),但最后仍听起来更好(主管增强)

+
+

等待时间和算法延时

每一个语音编解码器在传输中都会引入延时,对于Speex,延时等于帧长加上处理每一帧需要前几帧的数量

+
+

在窄带操作中延时为30ms,在宽带操作中延时为34ms,这不包括编解码帧时的CPU时间

+
+

相关组件

编解码器

Speex编解码器有以下特性

+
    +
  1. 免费软件/开源,免专利费和版税
  2. +
  3. 利用嵌入比特流集成了窄带和宽带
  4. +
  5. 大范围可用比特率(从2.15kbps44kbps
  6. +
  7. 动态比特率转换(AMR)和可变比特率操作(VBR
  8. +
  9. 声音活动检测(VAD,与VBR集成)和断续传输(DTX
  10. +
  11. 可变复杂度
  12. +
  13. 嵌入宽带结构(可伸缩采样率)
  14. +
  15. 32kHz超宽带采样率
  16. +
  17. 强度立体声编码选项
  18. +
  19. 定点实现
  20. +
+

预处理器

预处理器在对音频编码前对音频进行预处理,有三个主要功能

+
    +
  1. 噪声抑制
    先降噪再进行编解码是有好处的,因为Speex编解码器通常会对噪声输入同样进行编解码,这将会扩大噪声,而降噪能大大减少这一影响
  2. +
  3. 自动增益控制(AGC
    自动增益控制(AGC)是为了处理录音音量在不同设置里有很大差别这一问题,AGC将会调整信号音量到参考音量大小
  4. +
  5. 声音活动检测(VAD
    预处理器提供的声音活动检测(VAD)比编解码器中直接提供的VAD更先进
  6. +
+

自适应抖动缓冲器

当通过UDPUser Datagram Protocal,用户数据报协议)或RTPReal Time Protocal,实时传输协议)传输声音(或其他任何内容)时,数据包可能丢失,不同延时到达,甚至乱序,抖动缓冲器的作用是对数据包进行重排序并保存在足够长的buffer(但有一定限度)里,然后将数据包发送去解码

+

声学回声消除器

在任何免提式通信系统中(下图),远端的语音在本地扬声器播放时,经过在房间里传播后又会被麦克风录音,如果将麦克风录音直接又发送到远端,则远端的用户将会听到他自己的回声
aec
声学回声消除器就是为了在将录音发送到远端前消除声学回声,提高了远端接收的语音质量

+

重采样器

重采样指转换音频的采样率,在任意采样率间进行转换(采样率必须是有理数),能控制质量和复杂度的折中,可用于能混合不同采样率流,支持声卡不支持的采样率,能转码等

+

Reference

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2017/12/29/speex/ +

发表日期:2017/12/29 15:12

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 相关概念
    1. 1.1. 采样率
    2. 1.2. 比特率
    3. 1.3. 质量(可变)
    4. 1.4. 复杂度(可变)
    5. 1.5. 可变比特率(VBR)
    6. 1.6. 平均比特率(ABR)
    7. 1.7. 声音活动检测(VAD)
    8. 1.8. 断续传输(DTX)
    9. 1.9. 知觉增强
    10. 1.10. 等待时间和算法延时
  2. 2. 相关组件
    1. 2.1. 编解码器
    2. 2.2. 预处理器
    3. 2.3. 自适应抖动缓冲器
    4. 2.4. 声学回声消除器
    5. 2.5. 重采样器
  3. 3. Reference
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2018/03/07/usage-of-core-in-linux/index.html b/2018/03/07/usage-of-core-in-linux/index.html new file mode 100644 index 000000000..d62bed531 --- /dev/null +++ b/2018/03/07/usage-of-core-in-linux/index.html @@ -0,0 +1,2050 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Linux下core文件使用 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + Linux下core文件使用 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 631阅读时长: 13 min +
+ +
+ + + 2018/03/07 + + + + +
+
+ +
+
+ + + + +
+
+
+

有时候程序会异常退出而不带任何日志,此时就可以使用core文件进行分析,它会记录程序运行的内存,寄存器,堆栈指针等信息

+ + +

什么是core文件

通常在Linux下遇到程序异常退出或者中止,我们都会使用core文件进行分析,其中包含了程序运行时的内存,寄存器,堆栈指针等信息,格式为ELF,可以理解是程序工作当前状态转储成一个文件,通过工具分析这个文件,我们可以定位到程序异常退出或者终止时相应的堆栈调用等信息,为解决问题提供帮助。

+

使用core文件调试

生成方法

    +
  1. 查看当前core文件的状态

    +
    1
    2
    3
    4
    $ ulimit -a
    ...
    -c: core file size (blocks) 0 # 关闭状态
    ...
    +
  2. +
  3. 打开生成开关

    +
    1
    2
    3
    4
    5
    ulimit -c unlimited
    ulimit -a
    ...
    -c: core file size (blocks) unlimited
    ...
    +
  4. +
  5. core文件的大小进行限制,单位为blocks,一般1 block=512 bytes,设置太小可能导致不会生成文件

    +
    1
    2
    3
    4
    5
    $ ulimit -c 1024
    $ ulimit -a
    ...
    -c: core file size (blocks) 1024
    ...
    +
  6. +
  7. 关闭生成开关

    +
    1
    2
    3
    4
    5
    ulimit -c 0
    ulimit -a
    ...
    -c: core file size (blocks) 0
    ...
  8. +
+
+

上面对core文件的操作仅对当前生效,若需要永久生效,则要将相应操作写入/etc/profile

+
+

生成路径

core文件默认生成在程序的工作目录,可以对生成路径进行设置,需要保证对对应目录有足够空间并具有写权限

+
1
echo /MyCoreDumpDir/core.%e.%p > /proc/sys/kernel/core_pattern
+

其中命名使用的参数列表

+
1
2
3
4
5
6
7
%p - insert pid into filename  # 添加 pid 
%u - insert current uid into filename # 添加当前 uid
%g - insert current gid into filename # 添加当前 gid
%s - insert signal that caused the coredump into the filename # 添加导致产生 core 的信号
%t - insert UNIX time that the coredump occurred into filename # 添加 core 文件生成时的 unix 时间
%h - insert hostname where the coredump happened into filename # 添加主机名
%e - insert coredumping executable name into filename # 添加命令名
+
+

/proc/sys/kernel/core_uses_pid这个文件的值若为1,则无论是否配置%p,最后生成的core文件都会添加pid

+
+

调试方法

可以使用gdbcore文件进行调试,编译时需要带上-g选项

+
1
2
3
4
5
6
$ gdb a.out
...
(gdb) core-file core
...
(gdb) bt
...
+ +

如需要在PC上调试嵌入式设备产生的core文件,则需要选取相应平台的gdb工具,并在进入gdb后设置符号文件的位置

+
1
2
3
4
5
6
7
8
$ xxx-xxx-gdb a.out
...
(gdb) solib-search-path xxx.so:xxx.so
...
(gdb) core-file core
...
(gdb) bt
...
+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2018/03/07/usage-of-core-in-linux/ +

发表日期:2018/03/07 16:03

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 什么是core文件
  2. 2. 使用core文件调试
    1. 2.1. 生成方法
    2. 2.2. 生成路径
    3. 2.3. 调试方法
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2018/05/03/cjson/cjson-tree.png b/2018/05/03/cjson/cjson-tree.png new file mode 100644 index 000000000..ee38ca712 Binary files /dev/null and b/2018/05/03/cjson/cjson-tree.png differ diff --git a/2018/05/03/cjson/index.html b/2018/05/03/cjson/index.html new file mode 100644 index 000000000..681d25d45 --- /dev/null +++ b/2018/05/03/cjson/index.html @@ -0,0 +1,2070 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + cJSON的秘密 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + cJSON的秘密 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 892阅读时长: 18 min +
+ +
+ + + 2018/05/03 + + + + +
+
+ +
+
+ + + + +
+
+
+

学习使用cJSON过程的一些发现和总结,不涉及具体的函数

+ + +

cJSON简介

cJSON是一个快速,高性能的json解析器,由C语言编写,仅包含cJSON.ccJSON.h两个文件,不支持跨平台;跨平台推荐纯lua写的dkjson

+

cJSON结构体

cJSON结构体的组成:

+
1
2
3
4
5
6
7
8
9
10
11
12
typedef struct cJSON {
struct cJSON *next, *prev;
struct cJSON *child;

int type;

char *valuestring;
int valueint;
double valuedouble;

char *string;
} cJSON;
+

其中

+
    +
  • next指向链表中下一个兄弟节点,prev指向本节点前一个节点
  • +
  • child节点只有对象和数组有,并且child节点是双向链表的头节点,childprev一般为NULL,不指向任何节点,双向链表的最后一个兄弟节点的next是无指向的
  • +
  • type取值有Null/True/False/Number/String/Array/Object,这些值类型都在cJSON.h中通过宏定义了
  • +
  • String类型节点有valuestring Number类型节点有valueintvaluedouble
  • +
  • string表示节点的名称,所有的节点都是一个链表,都具有string
  • +
+
+

cJSON默认所有值都为0,除非额外为其赋有意义的值

+
+

cJSON树结构

cJSON使用树结构存储JSON的各个节点,而这个树结构是使用双向链表实现的(实线表示节点间有真实的引用关系,而虚线表示逻辑上的引用关系):
cJSON树结构

+
    +
  • 树结构的每一层都是一个双向链表,表示一堆兄弟节点
  • +
  • 当前层的所有节点都是当前链表头节点的父节点的子节点
  • +
+

下面举例说明:

+
1
2
3
4
5
6
7
8
9
10
{
"name": "Jack (\"Bee\") Nimble",
"format": {
"type": "rect",
"width": 1920,
"height": 1080,
"interlace": false,
"frame rate": 24
}
}
+ +
    +
  • nameformat节点组成一个链表,typewidthheightinterlaceframe rate节点组成一个链表
  • +
  • 根节点包含节点类型Object和子节点name
  • +
  • 子节点包含节点名称name、节点值Jack ("Bee") Nimble和兄弟节点format
  • +
  • format节点包含节点类型Object、节点名称format和子节点type
  • +
  • type节点包含节点类型String、节点名称type、节点值rect和兄弟节点width
  • +
  • width节点包含节点类型Number、节点名称width、节点值1920和兄弟节点height
  • +
  • height节点包含节点类型Number、节点名称height、节点值1080和兄弟节点interlace
  • +
  • interlace节点包含节点类型False、节点名称interlace和兄弟节点frame rate
  • +
  • frame rate节点包含节点类型Number、节点名称frame tate和节点值25
  • +
+

cJSON内存管理

cJson分为自动和手动两种使用方式:

+
    +
  • 在自动模式下,cJSON使用默认的mallocfree函数管理内存,在cJSON中,每个节点都是malloc而来,每个节点的stringvaluestring也是malloc而来,使用cJSON_Delete函数可以递归释放JSON树中malloc的节点内存和字符内存,使用cJSON_Print函数后,则需要手动释放cJSON_Print函数分配的内存,避免内存泄露
  • +
  • 在手动模式下,cJSON提供了钩子函数来帮助用户自定义内存管理函数,如果不设置,这默认为mallocfree
  • +
+
1
2
struct cJSON_Hooks js_hook = {xxx_malloc, xxx_free};
cJSON_InitHooks(&js_hook);
+ +

cJSON序列化

cJSON序列化就是把cJSON输出,有两种形式:

+
    +
  • 格式化输出char *cJSON_Print(cJSON *item);
  • +
  • 压缩输出char *cJSON_PrintUnformatted(cJSON *item);
  • +
+

需要注意的是cJSON采用了预先将要输的内容全部以字符串形式存储在内存中,最后输出整个字符串的方法,而不是边分析json数据边输出,所以对于比较大的json数据来说,内存就是个问题了

+

Reference

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2018/05/03/cjson/ +

发表日期:2018/05/03 16:05

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. cJSON简介
  2. 2. cJSON结构体
    1. 2.1. cJSON树结构
  3. 3. cJSON内存管理
  4. 4. cJSON序列化
  5. 5. Reference
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2018/09/25/coverage-of-code/gcovr_xxx.png b/2018/09/25/coverage-of-code/gcovr_xxx.png new file mode 100644 index 000000000..b1d6bf475 Binary files /dev/null and b/2018/09/25/coverage-of-code/gcovr_xxx.png differ diff --git a/2018/09/25/coverage-of-code/gcovr_xxx_detail.png b/2018/09/25/coverage-of-code/gcovr_xxx_detail.png new file mode 100644 index 000000000..b6f6dd822 Binary files /dev/null and b/2018/09/25/coverage-of-code/gcovr_xxx_detail.png differ diff --git a/2018/09/25/coverage-of-code/gcovr_xxx_main.png b/2018/09/25/coverage-of-code/gcovr_xxx_main.png new file mode 100644 index 000000000..72421f309 Binary files /dev/null and b/2018/09/25/coverage-of-code/gcovr_xxx_main.png differ diff --git a/2018/09/25/coverage-of-code/index.html b/2018/09/25/coverage-of-code/index.html new file mode 100644 index 000000000..462e16f77 --- /dev/null +++ b/2018/09/25/coverage-of-code/index.html @@ -0,0 +1,2073 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + C代码覆盖率测试工具Gcov · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + C代码覆盖率测试工具Gcov + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 1.8k阅读时长: 40 min +
+ +
+ + + 2018/09/25 + + + + +
+
+ +
+
+ + + + +
+
+
+

代码覆盖率测试反映了测试的广度与深度,量化了测试和开发质量,是十分有必要的,业界目前有针对各种语言的覆盖率测试工具,本文主要介绍C/C++相关的覆盖率测试工具Gcov

+ + +

介绍

简介

Gcov是一个测试覆盖程序,是集成在GCC中的,随GCC一起发布

+

基本概念

基本块BB

基本块指一段程序的第一条语句被执行过一次后,这段程序中的每一跳语句都需要执行一次,称为基本块,因此基本块中的所有语句的执行次数是相同的,一般由多个顺序执行语句后边跟一个跳转语句组成

+

跳转ARC

从一个BB到另外一个BB的跳转叫做一个ARC,要想知道程序中的每个语句和分支的执行次数,就必须知道每个BBARC的执行次数

+

程序流图

如果把BB作为一个节点,这样一个函数中的所有BB就构成了一个有向图,要想知道程序中的每个语句和分支的执行次数,就必须知道每个BBARC的执行次数,根据图论可以知道有向图中BB的入度和出度是相同的,所以只要知道了部分的BB或者ARC大小,就可以推断所有的大小,这里选择由ARC的执行次数来推断BB的执行次数,所以对部分ARC插桩,只要满足可以统计出来所有的BBARC的执行次数即可

+

原理

测试程序首先进行编译预处理,生成汇编文件,并完成插桩,插桩的过程中会向源文件的末尾插入一个静态数组,数组的大小就是这个源文件中桩点的个数,数组的值就是桩点的执行次数,每个桩点插入3~4条汇编语句,直接插入生成的*.s文件中,最后汇编文件经过汇编生成目标文件,在程序运行过程中桩点负责收集程序的执行信息

+

使用

编译

测试代码如下:
say.c:

+
1
2
3
4
5
6
#include <stdio.h>

int say(char *what) {
printf("------ %s\n", what);
return 0;
}
+

main.c

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

extern int say(const char *);

int main(int argc, const char *argv[]) {

if (argv[1]) {
say("hello");
} else {
say("bye");
}
return 0;
}

+ +

添加-fprofile-arcs -ftest-coverage -fPIC编译参数编译程序,生成可执行程序和*.gcno文件,里面记录了行信息和程序流图信息:

+
1
2
3
4
$ gcc -fprofile-arcs -ftest-coverage -fPIC -O0 say.c main.c

$ ls
a.out main.c main.gcno say.c say.gcno
+ +

数据收集

运行可执行文件,生成*.gcda在默认生成在相应*.o文件目录,里面记录了*.c文件中程序的执行情况,包括跳变次数等:

+
1
2
3
4
5
$ ./a.out
------ bye

$ ls
a.out main.c main.gcda main.gcno say.c say.gcda say.gcno
+

可以通过设置环境变量GCOV_PREFIX=/xxx/xxxGCOV_PREFIX_STRIP=x来改变路径,其中GCOV_PREFIX_STRIP表示去掉源代码路径中的前几级,默认为0,比如源代码路径为/a/b/c/d.cGCOV_PREFIX_STRIP=2,则实际使用的路径是c/d.c,如果GCOV_PREFIX=/e/f,则.gcda实际存放的路径是/e/f/c/d.gcda

+

报告生成

针对某一个文件的执行情况,可以通过如下命令生成报告,并创建*.gcov文件:

+
1
2
3
4
$ gcov -a main.c
File 'main.c'
Lines executed:80.00% of 5
Creating 'main.c.gcov'
+

常用选项,更多可参考Invoking gcov

+
1
2
3
-b:分支覆盖
-a:所有基本块覆盖
-f:函数覆盖
+ +

注意事项

    +
  1. 在编译时不要加优化选项,否则代码会发生变化,无法准确定位
  2. +
  3. 代码中复杂的宏,比如宏展开后是循环或者其他控制结构,可以用内联函数来代替,因为gcov只统计宏调用出现的那一行
  4. +
  5. 代码每一行最好只有一条语句
  6. +
  7. *.gcno*.gcda需要匹配,两个文件是有时间戳来记录是不是匹配的
  8. +
  9. 若是编译动态库,需要在链接时-lgcov
  10. +
+

图形化展示

gcov生成的报告分散在各个源码文件所对应的*.gcov文件中,难以汇总分析,并且可视化效果较差,所以需要转化成可视图形化报告,有lcovgcovr两个工具可以完成,两者功能基本相同,本文主要介绍gcovr,是一个用Python编写的开源软件,大小只有几十KB,安装参见官网

+

列表形式

    +
  1. 代码覆盖率

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ gcovr -r .
    ------------------------------------------------------------------------------
    GCC Code Coverage Report
    Directory: .
    ------------------------------------------------------------------------------
    File Lines Exec Cover Missing
    ------------------------------------------------------------------------------
    main.c 5 4 80% 15
    say.c 3 3 100%
    ------------------------------------------------------------------------------
    TOTAL 8 7 87%
    ------------------------------------------------------------------------------
    +

    报告展示程序运行后覆盖了80%的代码

    +
  2. +
  3. 分支覆盖率

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ gcovr -b -r .
    ------------------------------------------------------------------------------
    GCC Code Coverage Report
    Directory: .
    ------------------------------------------------------------------------------
    File Branches Taken Cover Missing
    ------------------------------------------------------------------------------
    main.c 2 1 50% 14
    say.c 0 0 --%
    ------------------------------------------------------------------------------
    TOTAL 2 1 50%
    ------------------------------------------------------------------------------
    +

    报告展示了在main.c中有一个分支没有执行到

    +
  4. +
+

XML文件形式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$ gcovr --xml-pretty -r .
<?xml version="1.0" ?>
<!DOCTYPE coverage
SYSTEM 'http://cobertura.sourceforge.net/xml/coverage-04.dtd'>
<coverage branch-rate="0.5" branches-covered="1" branches-valid="2"
complexity="0.0" line-rate="0.875" lines-covered="7" lines-valid="8"
timestamp="1537930892" version="gcovr 3.4">
<sources>
<source>.</source>
</sources>
<packages>
<package branch-rate="0.5" complexity="0.0" line-rate="0.875" name="">
<classes>
<class branch-rate="0.5" complexity="0.0" filename="main.c"
line-rate="0.8" name="main_c">
<methods/>
<lines>
<line branch="false" hits="1" number="12"/>
<line branch="true" condition-coverage="50% (1/2)" hits="1" number="14">
<conditions>
<condition coverage="50%" number="0" type="jump"/>
</conditions>
</line>
<line branch="false" hits="0" number="15"/>
<line branch="false" hits="1" number="17"/>
<line branch="false" hits="1" number="19"/>
</lines>
</class>
<class branch-rate="0.0" complexity="0.0" filename="say.c" line-rate="1.0"
name="say_c">
<methods/>
<lines>
<line branch="false" hits="1" number="10"/>
<line branch="false" hits="1" number="11"/>
<line branch="false" hits="1" number="12"/>
</lines>
</class>
</classes>
</package>
</packages>
</coverage>
+ +

HTML文件形式

1
2
3
$ gcovr -r . --html -o xxx.html
$ ls
a.out main.c main.gcda main.gcno say.c say.gcda say.gcno xxx.html
+

可以发现添加--html参数后,可以生成html文件,用浏览器打开,如下图:
gcovr_xxx.png

+

还可以添加--html-details选项,为每个代码文件单独生成html

+
1
2
3
$ gcovr -r . --html --html-details -o xxx.html
$ ls
a.out main.c main.gcda main.gcno say.c say.gcda say.gcno xxx.html xxx.main.c.html xxx.say.c.html
+

可以发现多了xxx.main.c.htmlxxx.say.c.html,用浏览器打开xxx.html,如下图:
gcovr_xxx_detail.png
文件名较之前带上了下划线,单击文件名,可以看到具体的代码覆盖情况,如下图:
gcovr_xxx_main.png

+

其它

其它功能,如Filters等,可以参考官方文档

+

Reference

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2018/09/25/coverage-of-code/ +

发表日期:2018/09/25 18:09

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 介绍
    1. 1.1. 简介
    2. 1.2. 基本概念
      1. 1.2.1. 基本块BB
      2. 1.2.2. 跳转ARC
      3. 1.2.3. 程序流图
    3. 1.3. 原理
  2. 2. 使用
    1. 2.1. 编译
    2. 2.2. 数据收集
    3. 2.3. 报告生成
    4. 2.4. 注意事项
    5. 2.5. 图形化展示
      1. 2.5.1. 列表形式
      2. 2.5.2. XML文件形式
      3. 2.5.3. HTML文件形式
      4. 2.5.4. 其它
  3. 3. Reference
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2019/02/12/git-help-v2/git-work-flow.jpg b/2019/02/12/git-help-v2/git-work-flow.jpg new file mode 100644 index 000000000..728e6118d Binary files /dev/null and b/2019/02/12/git-help-v2/git-work-flow.jpg differ diff --git a/2019/02/12/git-help-v2/index.html b/2019/02/12/git-help-v2/index.html new file mode 100644 index 000000000..ab1225cff --- /dev/null +++ b/2019/02/12/git-help-v2/index.html @@ -0,0 +1,2245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Git速查手册(第二版) · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + Git速查手册(第二版) + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 2.9k阅读时长: 63 min +
+ +
+ + + 2019/02/12 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文是对之前Git速查手册的更新,增加了一些这段时间使用到的命令。

+ + +

配置git

笔者使用的是v2.1.0,推荐大家使用v1.8以上的版本。 查看git版本:

+
1
$ git --version
+

配置命令git config分为三个级别:

+
1
2
3
--system : 系统级,位于 /etc/gitconfig .
--global : 用户级,位于 ~/.gitconfig .
--local : 仓库级,位于 repo/.git/config ,default并且优先级最高.
+

首先需要删除global用户信息,防止不同git软件之间的冲突:

+
1
2
$ git config --global --unset user.name
$ git config --global --unset user.email
+

设置用户信息.若同时使用gitlab和github,推荐配置local用户信息:

+
1
2
$ git config --local user.name "username"
$ git config --local user.email "email"
+ +

git支持https和ssh等协议.https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,而ssh支持的原生git协议速度最快。
检查本机SSH公钥:

+
1
$ ls ~/.ssh
+

若存在,则将id_rsa.pub添加到github的SSH keys中。若不存在,则生成:

+
1
$ ssh-keygen -t rsa -C "your_email@youremail.com" 
+

当ssh配置完成后,再次检查ssh连接情况:

+
1
2
$ ssh -T git@github.com
Hi! You’ve successfully authenticated, but GitHub does not provide shell access.
+

若出现上述信息,则表示设置成功。
若使用https访问, 则进行如下配置,并且设置超时时间避免重复输入密码:

+
1
2
$ git config --global http.sslverify false
$ git config --global credential.helper 'cache --timeout=3600'
+

设置可视化diff和merge工具, linux系统上推荐使用meld或者diffuse:

+
1
2
$ git config --global diff.tool meld
$ git config --global merge.tool meld
+

保存用户名,密码, 避免每次pull/push操作都需要手动输入:

+
1
2
$ git config --global credential.helper store
# 执行上免的命令后, 下次操作输入的密码会被保存
+

设置颜色,利于使用:

+
1
$ git config --global color.ui.true
+

设置别名:

+
1
$ git config --global alias checkout co 
+
+

上面的命令将checkout设置为别名co

+
+

最后,查看一下所有的设置:

+
1
2
3
$ git config --local --list
$ git config --global --list
$ git config --system --list
+ + +

工作流

工作流

+

工作区就是你的本地仓库文件夹,不过其中的.git目录不属于工作区,而是版本库。里面存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
现在来解释一下前面的添加和提交操作:

+
    +
  1. git add把文件添加进去,实际上就是把文件修改添加到暂存区;
  2. +
  3. git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
    因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
  4. +
+

基本操作

获取远程仓库:

+
1
$ git clone git@github.com:USERNAME/repo.git
+

将本地的仓库添加到远程:

+
1
2
3
$ cd repo
$ git init
$ git remote add origin git@github.com:USERNAME/repo.git
+
+

origin就是一个名字,是git为你默认创建的指向这个远程代码库的标签。

+
+

添加修改:

+
1
2
3
$ git add <filename> 
$ git add . # 添加当前目录所有修改过的文件
$ git add * # 递归地添加执行命令时所在的目录中的所有文件
+ +

提交修改:

+
1
2
$ git commit -m "commit message"
$ git commit -am "commit message"
+
+

commit message的填写可以参考写好 Git Commit 信息的 7 个建议
am将添加和提交合并为一步,但只对本来就存在的文件有效。

+
+

推送修改:

+
1
$ git push -u origin <feature-branch-name>
+
+

-u选项可以将本地分支与远程分支关联,下次git pull操作时可以不带参数.具体参见这里

+
+

查看远程仓库:

+
1
2
3
$ git remote -v
origin git@github.com:USERNAME/repo.git (push)
origin git@github.com:USERNAME/repo.git (fetch)
+ +

fork后同步上游仓库的更新:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
# 第一次需要添加上游仓库
$ git remote add upstream git@github.com:USERNAME/repo.git

$ git remote -v
origin git@github.com:USERNAME/repo.git (push)
origin git@github.com:USERNAME/repo.git (fetch)
upstream git@github.com:USERNAME/repo.git (push)
upstream git@github.com:USERNAME/repo.git (fetch)

$ git fetch upstream
$ git difftool <branch-name> upstream/master
$ git merge upstream/master
$ git mergetool
+ +

引用公共代码:
代码引用在git上有两种方式:submodulesubtree,推荐使用subtree方式。

+
1
2
3
4
5
6
7
8
9
# 第一次初始化
$ git remote add -f <remote-subtree-repository-name> <remote-subtree-repository-url>
$ git subtree add --prefix=<local-subtree-directory> <remote-subtree-repository> <remote-subtree-branch-name> --squash

# 同步subtree的更新
$ git subtree pull --prefix=<local-subtree-directory> <remote-subtree-repository> <remote-subtree-branch-name> --squash

# 推送到远程subtree库
$ git subtree push --prefix=<local-subtree-directory> <remote-subtree-repository> <remote-subtree-branch-name>
+ +

使用标签

查看标签 :

+
1
$ git tag
+ +

创建标签 :

+
1
2
$ git tag -a <tagname> -m "tag message" # 创建标签在当前最新提交的commit上
$ git tag -a <tagname> -m "tag message" <commit id> # 创建标签在指定的commit上
+

推送标签到远程:

+
1
2
$ git push origin <tagname> # 推送一个本地标签
$ git push origin --tags # 推送全部未推送过的本地标签
+

删除标签:

+
1
2
$ git tag -d <tagname> # 删除一个本地标签;
$ git push origin :refs/tags/<tagname> # 删除一个远程标签。
+ +

撤销与回退

查看当前仓库状态:

+
1
$ git status
+

查看文件更改:

+
1
2
$ git difftool <filename>
$ git mergetool <filename>
+ +

查看提交历史:

+
1
2
$ git log
$ git log --pretty=oneline #只保留commit id 和 commit message
+ +

撤销工作区Tracked files的修改:

+
1
$ git checkout -- <filename>
+ +

撤销工作区Untracked files的修改:

+
1
2
3
4
5
6
7
8
9
#####
# n:查看将会删除的文件,防止误删
# f:Untracked的文件
# d:Untracked的目录
# x:包含gitignore的Untracked文件和目录一并删掉,慎用!
#####

git clean -nfd
git clean -fd
+ +

回退版本区(git commit)和暂存区(git add),不删除工作空间代码:

+
1
2
$ git reset --mixed HEAD^ # --mixed为默认参数
$ git reset HEAD^
+ +

回退版本区(git commit),暂存区(git add)不回退,不删除工作空间代码:

+
1
$ git reset --soft HEAD^
+ +

回退版本区(git commit)和暂存区(git add),并删除工作空间代码(不包括Untracked files),执行后直接恢复到指定<commit-id>状态:

+
1
$ git reset --hard <commit-id>
+
+

HEAD表示当前版本,HEAD^表示上个版本,HEAD^^表示上上个版本,上100个版本可以表示为HEAD~100以此类推。

+
+

回退版本后,若需要返回原来的版本,会发现找不到未来的commit id,则需要查看操作命令历史进行查找:

+
1
$ git reflog
+ +

从版本库删除文件:

+
1
$ git rm <filename>
+ +

若你的代码已经push到线上,则推荐使用下面这个命令回滚:

+
1
$ git revert <commit-id>
+
+

revert是用一次新的commit来回滚之前的commit,更安全;reset则是直接删除指定的commit,若直接push会导致冲突。

+
+

分支

查看所有分支,有*标记的是当前分支:

+
1
$ git branch -a
+

创建本地分支:

+
1
$ git branch <newbranch>
+ +

创建并切换本地分支:

+
1
$ git checkout -b <newbranch>
+ +

从标签创建分支:

+
1
2
$ git branch <branch> <tagname>
$ git checkout <branch> # 切换到新建分支
+ +

推送新建本地分支到远程:

+
1
2
3
$ git push -u origin <remote-branch-name>
or
$ git push --set-upstream origin <remote-branch-name>
+ +

删除本地分支:

+
1
$ git branch -d <branch>
+
+

若当前分支因为有修改未提交或其它情况不能删除,请使用-D选项强制删除。

+
+

删除远程分支(三种方法):

+
1
2
3
$ git push origin --delete <remote-branch-name>
$ git push origin -d <remote-branch-name>
$ git push origin :<remote-branch-name>
+ +

清除无用的分支:

+
1
$ git remote prune origin
+
+

说明:remote上的一个分支被其他人删除后,需要更新本地的分支列表。

+
+

获取远程分支到本地已有分支:

+
1
$ git branch --set-upstream <local-branch> origin/branch
+ +

获取远程分支到本地并新建本地分支:

+
1
$ git checkout -b <local-branch> <remote-branch>
+ +

同步当前分支的更新,使用git pull并不保险:

+
1
2
3
4
5
6
7
8
# 下载最新的代码到远程跟踪分支, 即origin/<branch-name>
$ git fetch origin <branch-name>
# 查看更新内容
$ git difftool <branch-name> origin/<branch-name>
# 尝试合并远程跟踪分支的代码到本地分支
$ git merge origin/<branch-name>
# 借助mergetool解决冲突
$ git mergetool
+ +

同步其它分支的更新,本例拉取master分支更新:

+
1
2
3
4
$ git fetch origin master
$ git difftool <branch-name> origin/master
$ git merge origin/master
$ git mergetool
+ +

查看某个<commit id>属于哪个分支:

+
1
$ git branch -a --contains <commit id>
+ +

暂存

当你需要切换分支时,若当前工作区还有些修改没有完成,又不适合提交的,操作切换分支是会提示出错的.这时就需要将这些修改暂存起来:

+
1
$ git stash save "message"
+ +

查看:

+
1
$ git stash list
+ +

恢复:

+
1
2
3
$ git stash pop [--index] [stash@{num}] 
or
$ git stash apply [--index] [stash@{num}] # 不删除已恢复的进度.
+
+

--index表示不仅恢复工作区,还会恢复暂存区;num是你要恢复的操作的序列号,默认恢复最新进度.

+
+

删除进度:

+
1
2
$ git stash drop [stash@{num}] # 删除指定进度
$ git stash clear # 删除所有
+ +

清理仓库

清理无用的分支和标签

1
2
3
4
$ git branch -d <branch-name>
$ git tag -d <tag-name>
$ git remote prune origin
$ git pull
+ +

清理大文件

    +
  • 查看git相关文件占用空间:

    +
    1
    2
    $ git count-objects -v
    $ du -sh .git
    +
  • +
  • 寻找大文件ID

    +
    1
    $ git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10
    +
    +

    输出的第一列是文件ID,第二列表示文件(blob)或目录(tree),第三列是文件大小,此处筛选了最大的10条

    +
    +
  • +
  • 获取文件名与ID映射

    +
    1
    $ git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}')"
    +
  • +
  • 从所有提交中删除文件

    +
    1
    2
    $ git filter-branch --tree-filter 'rm -rf xxx' HEAD --all
    $ git pull
    +
  • +
  • 清理.git目录:

    +
    1
    $ git gc --prune=now
    +
    +

    tips: 在执行push操作时,git会自动执行一次gc操作,不过只有loose object达到一定数量后才会真正调用,建议手动执行。

    +
    +
  • +
+

处理大型二进制文件

由于git在存储二进制文件时效率不高,所以需要借助第三方组件

+

忽略特殊文件

当你的仓库中有一些文件,类似密码或者数据库文件不需要提交但又必须放在仓库目录下,每次git status都会提示Untracked,看着让人很不爽,提供两种方法解决这个问题

+

本地

在代码仓库目录创建一个.gitignore文件,编写规则如下:

+
1
2
3
tmp/  # 忽略tmp文件夹下所有内容
*.ini # 忽略所有ini文件
!data/ #忽略除了data文件夹的所有内容
+ +

全局

在用户目录创建一个.gitignore_global文件,编写规则同.gitignore,并修改~/.gitconfig

+
1
2
[core]
excludesfile = ~/.gitignore_global
+ +

如果添加的忽略对象已经Tracked,纳入了版本管理中,则需要在代码仓库中先把本地缓存删除,改变成Untracked状态

+
1
$ git rm -r --cached .
+
+

.gitignore模版

+
+

奇技淫巧

重写历史(慎用!)

1
$ git rebase -i [git-hash| head~n]
+
+

其中git-hash是你要开始进行rebasecommithash,而head~n则是从HEAD向前推ncommit

+
+

全局更换电子邮件

1
2
3
4
5
6
7
8
9
git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_EMAIL" = "xxx@localhost" ];
then
GIT_AUTHOR_NAME="xxx";
GIT_AUTHOR_EMAIL="xxx@example.com";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD --all
+ +

帮助

查看帮助:

+
1
$ git --help
+ +

Reference

    +
  1. 廖雪峰老师的git教程
  2. +
  3. 常用Git命令清单
  4. +
  5. Git-Book
  6. +
  7. Git-Reference
  8. +
  9. Git push与pull的默认行为
  10. +
  11. git stash 详解
  12. +
+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2019/02/12/git-help-v2/ +

发表日期:2019/02/12 12:02

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 配置git
  2. 2. 工作流
  3. 3. 基本操作
  4. 4. 使用标签
  5. 5. 撤销与回退
  6. 6. 分支
  7. 7. 暂存
  8. 8. 清理仓库
    1. 8.1. 清理无用的分支和标签
    2. 8.2. 清理大文件
    3. 8.3. 处理大型二进制文件
  9. 9. 忽略特殊文件
    1. 9.1. 本地
    2. 9.2. 全局
  10. 10. 奇技淫巧
    1. 10.1. 重写历史(慎用!)
    2. 10.2. 全局更换电子邮件
  11. 11. 帮助
  12. 12. Reference
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2019/04/13/hide-symbol-of-static-library/index.html b/2019/04/13/hide-symbol-of-static-library/index.html new file mode 100644 index 000000000..f3ac7ac12 --- /dev/null +++ b/2019/04/13/hide-symbol-of-static-library/index.html @@ -0,0 +1,2054 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + 屏蔽静态库接口 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + 屏蔽静态库接口 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + + + +
+ + + + +
+ 字数统计: 350阅读时长: 8 min +
+ +
+ + + 2019/04/13 + + + + +
+
+ +
+
+ + + + +
+
+
+

分享屏蔽静态库接口的一种方法.

+ + +

准备

hello.c:

+
1
2
3
4
5
#include <stdio.h>

__attribute__ ((visibility ("default"))) void hello() {
printf("Hello World!\n");
}
+

hello.h:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef __HELLO__H
#define __HELLO__H

#ifdef __cplusplus
extern "C" {
#endif

void hello();

#ifdef __cplusplus
}
#endif

#endif
+ +

bye.c:

+
1
2
3
4
5
#include <stdio.h>

void bye() {
printf("Bye Bye!\n");
}
+

bye.h:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef __BYE__H
#define __BYE__H

#ifdef __cplusplus
extern "C" {
#endif

void bye();

#ifdef __cplusplus
}
#endif

#endif
+ +

编译

编译时使用-fvisibility=hidden,可以默认将符号隐藏;需要对外的符号使用__attribute__ ((visibility ("default")))修饰即可:

+
1
2
$ gcc -fvisibility=hidden -I. -c hello.c -o hello.o
$ gcc -fvisibility=hidden -I. -c bye.c -o bye.o
+

其中hello()未被隐藏,bye()是被隐藏的.

+

链接

将生成的两个.o文件重定位到libt.o中:

+
1
$ ld -r hello.o bye.o -o libt.o
+ +

去除无用的符号

1
$ strip --strip-unneeded libt.o
+ +

隐藏的符号本地化(我也不知道中文怎么翻译了)

1
$ objcopy --localize-hidden libt.o libt_hidden.o
+ +

打包成静态库

1
$ ar crv libt.a libt_hidden.o
+ +

验证

调用未被隐藏的hello()

test1.c:

+
1
2
3
4
5
6
#include "hello.h"

int main(void) {
hello();
return 0;
}
+

编译并运行

+
1
2
3
$ gcc -I. test1.c -L. -lt -o test
$ ./test
Hello World!
+ +

调用隐藏的bye()

test2.c

+
1
2
3
4
5
6
#include "bye.h"

int main(void) {
bye();
return 0;
}
+

编译并运行

+
1
2
3
4
5
$ gcc -I. test2.c -L. -lt -o test
$ ./test
/tmp/ccdaJT7s.o: In function `main':
test2.c:(.text+0xa): undefined reference to `bye'
collect2: error: ld returned 1 exit status
+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2019/04/13/hide-symbol-of-static-library/ +

发表日期:2019/04/13 14:04

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 准备
  2. 2. 编译
  3. 3. 链接
  4. 4. 去除无用的符号
  5. 5. 隐藏的符号本地化(我也不知道中文怎么翻译了)
  6. 6. 打包成静态库
  7. 7. 验证
    1. 7.1. 调用未被隐藏的hello()
    2. 7.2. 调用隐藏的bye()
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2019/04/26/what-is-sysroot/index.html b/2019/04/26/what-is-sysroot/index.html new file mode 100644 index 000000000..0b4b759a0 --- /dev/null +++ b/2019/04/26/what-is-sysroot/index.html @@ -0,0 +1,2038 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + sysroot为何物? · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + sysroot为何物? + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + + + +
+ + + + +
+ 字数统计: 376阅读时长: 7 min +
+ +
+ + + 2019/04/26 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文介绍链接过程中sysroot的作用。

+ + +

sysroot为何物

做过交叉编译的同学们,一定对下面这个错误十分熟悉吧:

+
1
2
/cross-compiling/ld: cannot find crt1.o: No such file or directory
/cross-compiling/ld: cannot find crti.o: No such file or directory
+

在我们的pc上,这两个文件一般在/usr/lib或者/usr/lib32中,通过gcc -print-search-dirs可以看到这两个路径默认就在库的搜索路径中,所以在pc上编译程序时不存在链接器找不到crt1.ocrti.o的问题。

+
+

crt1.o负责应用程序的启动,其中包含了程序的入口函数_start以及两个未定义的符号__libc_start_mainmain,由_start负责调用__libc_start_main初始化libc,然后调用我们源代码中定义的main函数,crti.o负责辅助启动这些代码。

+
+

下面我们使用交叉编译工具链来查看库的搜索路径/cross-compiling/gcc -print-search-dirs,发现crt1.ocrti.o的所在目录并不在库的搜索路径中,所以会出现上述的问题。

+

下面就需要sysroot出场了。
sysroot被称为逻辑根目录,只在链接过程中起作用,作为交叉编译工具链搜索库文件的根路径,如配置--sysroot=dir,则dir作为逻辑根目录,链接器将在dir/usr/lib中搜索库文件。

+
+

只有链接器开启了–with-sysroot选项,–sysroot=director才生效

+
+

Reference

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2019/04/26/what-is-sysroot/ +

发表日期:2019/04/26 17:04

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. sysroot为何物
  2. 2. Reference
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2019/05/21/man-strtok/index.html b/2019/05/21/man-strtok/index.html new file mode 100644 index 000000000..4ebe2a89a --- /dev/null +++ b/2019/05/21/man-strtok/index.html @@ -0,0 +1,2064 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + 深究strtok系列函数 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + 深究strtok系列函数 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + + + +
+ + + + +
+ 字数统计: 1.6k阅读时长: 35 min +
+ +
+ + + 2019/05/21 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文通过分析源码,深究GLIBCstrtokstrtok_r函数的实现原理和使用过程中的注意事项。

+ + +

函数说明

1
2
3
4
#include <string.h>

char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);
+ +

说明

    +
  • strtok以包含在delim中的字符为分割符,将str分割成一个个子串;若str为空值NULL,则函数内部保存的静态指针(指向上一次分割位置后一个字节)在下一次调用中将作为起始位置。
  • +
  • strtok_r功能同strtok,不过其将strtok函数内部保存的指针显示化,通过saveptr输入,以saveptr作为分割的起始位置。
  • +
+

参数

    +
  • str: 待分割的源字符串
  • +
  • delim: 分割符字符集合
  • +
  • saveptr: 一个指向char *的指针变量,保存分割时的上下文
  • +
+

返回值

    +
  • 若未提取到子串,返回值为指向源字符串首地址的指针,可以完整打印源字符串
  • +
  • 若提取到子串,返回值为提取出的子串的指针,这个指针指向的是子串在源字符串中的起始位置,因为子串末尾的下一个字符在提取前为分割符,提取后被修改成了'/0’,所以可以成功打印子串的内容
  • +
  • 若在成功提取到子串后,没有可以被分割的子串,返回NULL
  • +
+

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>

int main(void) {
char str[12] = "hello,world\0";
char *token = strtok(str, ",");

while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, ",");
}

return 0;
}
+ +

使用注意事项

不会生成新的字符串,只是在源字符串上做了修改,源字符串会发生变化

1
2
3
4
char str[12] = "hello,world\0";
printf("str before strtok: %s\n", str);
char *token = strtok(str, ",");
printf("str after strtok: %s\n", str);
+
1
2
$ str before strtok: hello,world
$ str after strtok: hello
+

如上实验,str的值,在对其做strtok操作之后,发生了变化,分割符之后的内容不见了。事实上,strtok函数是根据输入的分割符(即,),找到其首次出现的位置(即world之前的,),将其修改为'/0’

+

第一个参数不可为字符串常量

因为strtok函数会修改源字符串,所以第一个参数不可为字符串常量,不然程序会抛出异常。

+

若在第一次提取子串后,继续对源字符串进行提取,应在其后的调用中将第一个参数置为空值NULL

1
2
3
4
5
6
char str[12] = "hello,world\0";
char *token = strtok(str, ",");
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, ",");
}
+
1
2
$ hello
$ world
+

在第一次提取子串时,strtok用一个指针指向了分割符的下一位,即’w’所在的位置,后续的提取给strtok的第一个参数传递了空值NULLstrtok会从上一次调用隐式保存的位置,继续分割字符串。

+

第二个参数是分割符的集合,支持多个分割符

1
2
3
char str[12] = "hello,world\0";
char *token = strtok(str, ",l");
printf("%s\n", token);
+
1
$ he
+

由上可见,strtok函数在分割字符串时,不是完整匹配第二个参数传入的分割符,而是使用包含在分割符集合中的字符进行匹配。

+

若首字符为分割符,则会被忽略

1
2
3
char str[13] = ",hello,world\0";
char *token = strtok(str, ",");
printf("%s\n", token);
+
1
$ hello
+

如上所示,若首字符为分割符,strtok采用了比常规处理更快的方式,直接跳过了首字符。

+

strtok为不可重入函数,使用strtok_r更灵活和安全

strtok函数在内部使用了静态变量,即用静态指针保存了下一次调用的起始位置,对调用者不可见;strtok_r则将strtok内部隐式保存的指针,以参数的形式由调用者进行传递、保存甚至是修改,使函数更具灵活性和安全性;此外,在windows也有分割字符串安全函数strtok_s

+

源码

strtok.c:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/* Copyright (C) 1991-2018 Free Software Foundation, Inc.
This file is part of the GNU C Library.

The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */

#include <string.h>


/* Parse S into tokens separated by characters in DELIM.
If S is NULL, the last string strtok() was called with is
used. For example:
char s[] = "-abc-=-def";
x = strtok(s, "-"); // x = "abc"
x = strtok(NULL, "-="); // x = "def"
x = strtok(NULL, "="); // x = NULL
// s = "abc\0=-def\0"
*/
char *
strtok (char *s, const char *delim)
{
static char *olds;
return __strtok_r (s, delim, &olds);
}
+ +

strtok_r.c:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/* Reentrant string tokenizer.  Generic version.
Copyright (C) 1991-2018 Free Software Foundation, Inc.
This file is part of the GNU C Library.

The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif

#include <string.h>

#ifndef _LIBC
/* Get specification. */
# include "strtok_r.h"
# define __strtok_r strtok_r
#endif

/* Parse S into tokens separated by characters in DELIM.
If S is NULL, the saved pointer in SAVE_PTR is used as
the next starting point. For example:
char s[] = "-abc-=-def";
char *sp;
x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def"
x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL
x = strtok_r(NULL, "=", &sp); // x = NULL
// s = "abc\0-def\0"
*/
char *
__strtok_r (char *s, const char *delim, char **save_ptr)
{
char *end;

if (s == NULL)
s = *save_ptr;

if (*s == '\0')
{
*save_ptr = s;
return NULL;
}

/* Scan leading delimiters. */
s += strspn (s, delim);
if (*s == '\0')
{
*save_ptr = s;
return NULL;
}

/* Find the end of the token. */
end = s + strcspn (s, delim);
if (*end == '\0')
{
*save_ptr = end;
return s;
}

/* Terminate the token and make *SAVE_PTR point past it. */
*end = '\0';
*save_ptr = end + 1;
return s;
}
#ifdef weak_alias
libc_hidden_def (__strtok_r)
weak_alias (__strtok_r, strtok_r)
#endif
+ +

Reference

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2019/05/21/man-strtok/ +

发表日期:2019/05/21 15:05

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 函数说明
    1. 1.1. 说明
    2. 1.2. 参数
    3. 1.3. 返回值
  2. 2. 示例
  3. 3. 使用注意事项
    1. 3.1. 不会生成新的字符串,只是在源字符串上做了修改,源字符串会发生变化
    2. 3.2. 第一个参数不可为字符串常量
    3. 3.3. 若在第一次提取子串后,继续对源字符串进行提取,应在其后的调用中将第一个参数置为空值NULL
    4. 3.4. 第二个参数是分割符的集合,支持多个分割符
    5. 3.5. 若首字符为分割符,则会被忽略
    6. 3.6. strtok为不可重入函数,使用strtok_r更灵活和安全
  4. 4. 源码
  5. 5. Reference
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2019/07/24/binary-to-object-file/index.html b/2019/07/24/binary-to-object-file/index.html new file mode 100644 index 000000000..26130bb7d --- /dev/null +++ b/2019/07/24/binary-to-object-file/index.html @@ -0,0 +1,2056 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + 将二进制文件作为目标文件中的一个段 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + 将二进制文件作为目标文件中的一个段 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + + + +
+ + + + +
+ 字数统计: 833阅读时长: 19 min +
+ +
+ + + 2019/07/24 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文将展示,如何将一个二进制文件(如图片、音频等)作为目标文件中的一个段,该技巧主要应用在一些无文件系统的平台。

+ + +

本次的实验场景为i386:x86-64 GNU/Linux,测试音频为nhxc.wav,测试程序为bin2obj.c

+

查看该平台的ELF文件相关信息

生成目标文件

+
1
$ gcc -c bin2obj.c -o bin2obj.o
+ +

查看该平台ELF文件相关信息

+
1
2
3
4
5
6
7
$ objdump -x bin2obj.o

bin2obj.o: file format elf64-x86-64
bin2obj.o
architecture: i386:x86-64, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x0000000000000000
+

由上可知,文件格式为elf64-x86-64CPU架构为architecture

+

转换

首先通过objcopy --help选项查看相关参数的意义:

+
1
2
3
4
5
6
$ objcopy --help
-I --input-target <bfdname> Assume input file is in format <bfdname>
-O --output-target <bfdname> Create an output file in format <bfdname>
-B --binary-architecture <arch> Set output arch, when input is arch-less
......
objcopy: supported targets: elf64-x86-64 elf32-i386 elf32-iamcu elf32-x86-64 a.out-i386-linux pei-i386 pei-x86-64 elf64-l1om elf64-k1om elf64-little elf64-big elf32-little elf32-big pe-x86-64 pe-bigobj-x86-64 pe-i386 plugin srec symbolsrec verilog tekhex binary ihex
+

由上可知,-I选项指定输入文件的格式,-O指定输出文件的格式,在supported targets中选择对应的格式;-B是指定目标文件的架构i386:x86-64,即上文objdump -x命令查询的architecture

+

转换:

+
1
$ objcopy -I binary -O elf64-x86-64 -B i386:x86-64 nhxc.wav audio.o
+ +

查看转换后生成的目标文件:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ objdump -x audio.o

audio.o: file format elf64-x86-64
audio.o
architecture: i386:x86-64, flags 0x00000010:
HAS_SYMS
start address 0x0000000000000000

Sections:
Idx Name Size VMA LMA File off Algn
0 .data 0000fab0 0000000000000000 0000000000000000 00000040 2**0
CONTENTS, ALLOC, LOAD, DATA
SYMBOL TABLE:
0000000000000000 l d .data 0000000000000000 .data
0000000000000000 g .data 0000000000000000 _binary_nhxc_wav_start
000000000000fab0 g .data 0000000000000000 _binary_nhxc_wav_end
000000000000fab0 g *ABS* 0000000000000000 _binary_nhxc_wav_size
+

可以看到file formatarchitecture信息与bin2obj.o的相同,_binary_nhxc_wav_start指向音频内容的起始地址,_binary_nhxc_wav_end指向音频内容的结尾地址,_binary_nhxc_wav_size指向文件大小的存储地址。

+
+

_binary_*_start/end/size*是二进制文件的文件名及后缀名。

+
+

测试

bin2obj.c

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <elf.h>

extern _binary_nhxc_wav_start;
extern _binary_nhxc_wav_end;
extern _binary_nhxc_wav_size;

int main() {
printf("binary to object:\n");

printf("elf head: %ld\n", sizeof(Elf64_Ehdr));
printf("_binary_nhxc_wav_size: %p\n_binary_nhxc_wav_end: %p\n_binary_nhxc_wav_size: %p\n", &_binary_nhxc_wav_start, &_binary_nhxc_wav_end, &_binary_nhxc_wav_size);

unsigned char * audio_buf = (unsigned char *)&_binary_nhxc_wav_start;
unsigned long size = (unsigned long)&_binary_nhxc_wav_size;

FILE *fp = fopen("./out.wav", "wb");
if (!fp) {
fprintf(stderr, "fopen failed!\n");
return -1;
}

fwrite(audio_buf, size, 1, fp);

fclose(fp);

return 0;
}
+

通过_binary_nhxc_wav_start_binary_nhxc_wav_size两个符号,读取音频文件。

+

编译并运行:

+
1
2
3
4
5
6
7
8
$ gcc -c bin2obj.c -o bin2obj.o
$ g++ bin2obj.o audio.o -o bin2obj
$ ./bin2obj
binary to object:
elf head: 64
_binary_nhxc_wav_size: 0x601040
_binary_nhxc_wav_end: 0x610af0
_binary_nhxc_wav_size: 0xfab0
+

比对写入的文件out.wav与原始文件nhxc.wav,完全一致:

+
1
2
155e62d81e84fa7493fefe82223bcc2a  nhxc.wav
155e62d81e84fa7493fefe82223bcc2a out.wav
+ +

查看audio.o:

+
1
2
3
4
5
6
$ hexdump -C audio.o | head -n 5
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|
00000010 01 00 3e 00 01 00 00 00 00 00 00 00 00 00 00 00 |..>.............|
00000020 00 00 00 00 00 00 00 00 d0 fb 00 00 00 00 00 00 |................|
00000030 00 00 00 00 40 00 00 00 00 00 40 00 05 00 02 00 |....@.....@.....|
00000040 52 49 46 46 a8 fa 00 00 57 41 56 45 66 6d 74 20 |RIFF....WAVEfmt |
+

如程序输出,ELF文件头部信息结构体为64字节,而转换生成的目标文件中,音频内容始于0x40字节偏移(wav头始于RIFF,可以参考wav文件解析),而0x40正是十进制的64

+

Reference

    +
  • 《程序员的自我修养——链接、装载与库》P68
  • +
+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2019/07/24/binary-to-object-file/ +

发表日期:2019/07/24 11:07

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 查看该平台的ELF文件相关信息
  2. 2. 转换
  3. 3. 测试
  4. 4. Reference
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2019/09/09/git-clone-extra-large-project/index.html b/2019/09/09/git-clone-extra-large-project/index.html new file mode 100644 index 000000000..8b5eb464d --- /dev/null +++ b/2019/09/09/git-clone-extra-large-project/index.html @@ -0,0 +1,2061 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Git仓库过大导致clone失败的解决方法 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + Git仓库过大导致clone失败的解决方法 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 543阅读时长: 12 min +
+ +
+ + + 2019/09/09 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文记录工作中遇到的clone大仓库失败的解决过程,以下问题与解决方案均基于https访问。

+ + +

错误一

web端查看仓库大小,大约1.5G左右,首先直接执行git clone,报错如下:

+
1
2
3
4
5
6
remote: Counting objects: 10994, done.
remote: Compressing objects: 100% (3085/3085), done.
error: RPC failed; curl 56 GnuTLS recv error (-110): The TLS connection was non-properly terminated.
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
+ +

增大postBuffer

在增大postBuffer的同时,关闭ssl认证:

+
1
2
$ git config --global http.postBuffer 2048000000 # 设置为2G
$ git config --global http.sslVerify false # 关闭sslVerify
+

设置成功后,重新clone,错误依旧。

+

使用openssl替换gunssl

1.安装相关依赖环境:

+
1
$ sudo apt-get install build-essential fakeroot dpkg-dev libcurl4-openssl-dev
+ +

2.获取git源码:

+
1
$ sudo apt-get source git
+

若出现如下错误:

+
1
E: You must put some 'source' URIs in your sources.list
+

则需要将设置->Software & Updates->Ubuntu Software->Source code勾选:
source_code

+

若出现如下错误:

+
1
couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied) [duplicate]
+

则需要更改权限:

+
1
sudo chown _apt /var/lib/update-notifier/package-data-downloads/partial/
+ +

3.安装git的依赖

+
1
$ sudo apt-get build-dep git
+ +

4.进入git目录,重新编译:

+
1
2
3
4
$ cd git-2.7.4/
$ vim ./debian/control # 将libcurl4-gnutls-dev修改为libcurl4-openssl-dev
$ vim ./debian/rules # 整行删除TEST=test
$ sudo dpkg-buildpackage -rfakeroot -b -uc -us -j4 # 编译
+ +

5.回到上一级目录,安装编译好的安装包:

+
1
2
$ cd ..
$ sudo dpkg -i git_2.7.4-0ubuntuxxx_amd64.deb # 安装包名字可能有所不同
+ +

执行完成如上步骤后,重新clone,发现依旧报错,请看错误二。

+

错误二

1
2
3
4
5
6
remote: Counting objects: 10994, done.
remote: Compressing objects: 100% (3085/3085), done.
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
+ +

重新确认postBuffer,配置确实生效了:

+
1
2
3
4
5
$ cat ~/.gitconfig

[http]
sslVerify = false
postBuffer = 2048000000
+ +

浅层clone

晕,实在搞不定了,采取极端方法,首先clone一层:

+
1
$ git clone --depth=1 http://xxx.git
+

浅层clone成功后,再完整拉取:

+
1
2
3
$ git fetch --unshallow # 拉取完整当前分支
$ git remote set-branches origin '*' # 追踪所有远程分支
$ git fetch -v # 拉取所有远程分支
+ +

至此,终于成功地clone了一个完整的仓库。

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2019/09/09/git-clone-extra-large-project/ +

发表日期:2019/09/09 12:09

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 错误一
    1. 1.1. 增大postBuffer
    2. 1.2. 使用openssl替换gunssl
  2. 2. 错误二
    1. 2.1. 浅层clone
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2019/09/09/git-clone-extra-large-project/source_code.png b/2019/09/09/git-clone-extra-large-project/source_code.png new file mode 100644 index 000000000..8beb59d89 Binary files /dev/null and b/2019/09/09/git-clone-extra-large-project/source_code.png differ diff --git a/2020/02/17/homebrew-in-mac/index.html b/2020/02/17/homebrew-in-mac/index.html new file mode 100644 index 000000000..073cf9d69 --- /dev/null +++ b/2020/02/17/homebrew-in-mac/index.html @@ -0,0 +1,2111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Homebrew · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + Homebrew + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + + + +
+ + + + +
+ 字数统计: 820阅读时长: 18 min +
+ +
+ + + 2020/02/17 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文将介绍Homebrew的安装与使用。

+ + +

Homebrew

简介

HomebrewOS X上类似于apt-getyum的软件包管理器,软件源依托于Github之上,所以在国内的网络环境之下,常常会出现使用Homebrew安装软件时,如brew install sshfs,经常会长时间卡在Updating Homebrew...

+
+

OS X 10.9开始支持

+
+

安装

首先安装依赖Xcode命令行工具

+
1
$ xcode-select --install
+ +

然后安装Homebrew

+
1
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
+ +

卸载

1
2
$ ruby -e "$(curl -fsSL $https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
$ sudo rm -rf /usr/local/
+ +

解决软件源更新慢问题

取消更新

当安装过程中,卡在Updating Homebrew...时,我们可以按住control + c,来取消本次更新;之后命令行会显示^C,表示取消成功,后面会继续安装工作。

+
+

这个方法是临时,仅在本次安装生效。

+
+

关闭自动更新

Homebrew的软件源更新,是在每次安装时自动执行的,可以通过配置进行关闭。

+

zsh终端方式:

+
1
2
$ echo 'export HOMEBREW_NO_AUTO_UPDATE=true' >> ~/.zshrc
$ source ~/.zshrc
+ +

bash终端方式:

+
1
2
$ echo 'export HOMEBREW_NO_AUTO_UPDATE=true' >> ~/.bash_profile
$ source ~/.bash_profile
+
+

这个方法是永久的,每次安装都会生效,但弊端是无法获取最新的软件。

+
+

替换软件源

这里推荐中科大的镜像源,亲测可用。

+

替换homebrew源

1
2
$ cd "$(brew --repo)"
$ git remote set-url origin https://mirrors.ustc.edu.cn/brew.git
+ +

还原官方源:

+
1
2
$ cd "$(brew --repo)"
$ git remote set-url origin https://github.com/Homebrew/brew.git
+ +

替换homebrew-core源(核心软件仓库)

1
2
$ cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
$ git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git
+ +

还原官方源:

+
1
2
$ cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
$ git remote set-url origin https://github.com/Homebrew/homebrew-core.git
+ +

替换homebrew-cask源(macOS应用)

1
2
$ cd "$(brew --repo)"/Library/Taps/homebrew/homebrew-cask 
$ git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git
+

若提示找不到"$(brew --repo)"/Library/Taps/homebrew/homebrew-cask,则:

+
1
2
$ cd "$(brew --repo)"/Library/Taps/homebrew/
$ git clone https://mirrors.ustc.edu.cn/homebrew-cask.git
+ +

还原官方源:

+
1
2
$ cd "$(brew --repo)"/Library/Taps/homebrew/homebrew-cask  
$ git remote set-url origin https://github.com/Homebrew/homebrew-cask
+ +
+

brew cask安装软件,会自动创建软链接到Application目录,这样在Launchpad中也能查看到安装的软件,方便启动软件

+
+

替换homebrew bottles源(预编译二进制软件包)

zsh终端方式:

+
1
2
$ echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.zshrc
$ source ~/.zshrc
+ +

bash终端方式:

+
1
2
$ echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.bash_profile
$ source ~/.bash_profile
+ +

还原官方源:进入如上终端配置文件,并删除HOMEBREW_BOTTLE_DOMAIN改行配置,并
source终端配置文件,使之生效。

+

常见错误

    +
  • Error: Another active Homebrew update process is already in progress.
    解决方法:rm -rf /usr/local/var/homebrew/locks
  • +
+

Homebrew常用命令

    +
  • 查看Homebrew版本:

    +
    1
    $ brew -v
    +
  • +
  • Homebrew帮助信息:

    +
    1
    $ brew [cask] -h
    +
  • +
  • 更新Homebrew:

    +
    1
    $ brew update
    +
  • +
  • 更新Homebrew cask:

    +
    1
    $ brew cask upgrade
    +
  • +
  • 安装软件:

    +
    1
    $ brew [cask] install <packageName>
    +
  • +
  • 卸载软件:

    +
    1
    $ brew [cask] uninstall <packageName>
    +
  • +
  • 查询可用软件:

    +
    1
    $ brew search <packageName>
    +
  • +
  • 查看已安装软件:

    +
    1
    $ brew [cask] list
    +
  • +
  • 查看软件信息:

    +
    1
    $ brew [cask] info <packageName>
  • +
+

确认shell版本方式

1
$ echo $SHELL
+
+

输出/bin/zshzsh终端,输出/bin/bashbash终端。

+
+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2020/02/17/homebrew-in-mac/ +

发表日期:2020/02/17 20:02

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. Homebrew
    1. 1.1. 简介
    2. 1.2. 安装
    3. 1.3. 卸载
  2. 2. 解决软件源更新慢问题
    1. 2.1. 取消更新
    2. 2.2. 关闭自动更新
    3. 2.3. 替换软件源
      1. 2.3.1. 替换homebrew源
      2. 2.3.2. 替换homebrew-core源(核心软件仓库)
      3. 2.3.3. 替换homebrew-cask源(macOS应用)
      4. 2.3.4. 替换homebrew bottles源(预编译二进制软件包)
  3. 3. 常见错误
  4. 4.
    1. 4.1. Homebrew常用命令
    2. 4.2. 确认shell版本方式
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2020/05/14/ld-hash-style/index.html b/2020/05/14/ld-hash-style/index.html new file mode 100644 index 000000000..278cfce5c --- /dev/null +++ b/2020/05/14/ld-hash-style/index.html @@ -0,0 +1,2073 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + --hash-style兼容性问题 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + --hash-style兼容性问题 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + + + + + +
+ + + + +
+ 字数统计: 640阅读时长: 14 min +
+ +
+ + + 2020/05/14 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文记录了解决 --hash-style 兼容性问题的过程。

+ + +

问题

1
dlopen failed: empty/missing DT_HASH in "libxxx.so" (built with --hash-style=gnu?)
+

最近,稳定性监控平台,被这一行错误日志霸榜,刚看到时也一脸懵逼,下面我们来逐步分析。

+

名词解释

首先需要查阅一下相关文档,了解一下其中的”新朋友”。

+
    +
  • DT_HASH

    +
    1
    ELF 中的一个 Sections,保存了一个用于查找符号的散列表,用于支持符号表的访问,能够提高符号搜索速度。
    +
  • +
  • --hash-style=style(以下解释摘自 man ld)

    +
    1
    Set the type of linker's hash table(s). style can be either "sysv" for classic ELF ".hash" section, "gnu" for new style GNU ".gnu.hash" section or "both" for both the classic ELF ".hash" and new style GNU ".gnu.hash" hash tables. The default is "sysv".
  • +
+

实验

通过查阅 --hash-style=style 参数,发现 style 支持三种配置:sysvgnuboth,废话不多说,先试一把。

+
    +
  • gcc -Wl,--hash-style=sysv

    +
    1
    2
    $ readelf -S libxxx.so  | grep "hash"
    [ 4] .hash HASH 0000000000003120 00003120
    +
  • +
  • gcc -Wl,--hash-style=gnu

    +
    1
    2
    $ readelf -S libxxx.so  | grep "hash"
    [ 4] .gnu.hash GNU_HASH 0000000000003120 00003120
    +
  • +
  • gcc -Wl,--hash-style=both

    +
    1
    2
    3
    $ readelf -S libxxx.so  | grep "hash"
    [ 4] .gnu.hash GNU_HASH 0000000000003120 00003120
    [ 5] .hash HASH 00000000000035f8 000035f8
  • +
+
+

-Wl 用于编译器向链接器传递参数。

+
+

如上,发现使用不同的配置,Sections Name 不同。

+
+

.gnu.hash 段​,提​供了​与 hash 段​相​同​的​功​能​;但​是与 hash 相比,增加了某些限制(附加规则),​导致了不兼容,带​来​了​ 50% 的​动​态​链​接​性​能​提​升​,具体参见 https://blogs.oracle.com/solaris/gnu-hash-elf-sections-v2

+
+

分析

结合实验结果,我先翻译一下问题中的那一行错误日志:

+
1
动态库加载失败,libxxx.so 中 DT_HASH 为空或者丢失,是不是用了 --hash-style=gnu 编译?
+

结合上表,若 --hash-style=gnu,那么 Section Name 就是 .gnu.hash 了,当然找不到.hash 了。

+

再查阅一下 Makefile 配置,发现并没有相关配置,怀疑是编译器的默认配置:

+
1
2
$ gcc -dumpspecs | grep "hash"
... --hash-style=gnu ...
+ +
+

-dumpspecs 参数可以打印编译器的内置规范。

+
+

果不其然,默认的 --hash-style 配置为了 gnu

+

结论

输出的动态库的 --hash-stylegnu,而目标系统并不能正确读取 --hash-stylegnu 的动态库,导致了如上的错误。

+

解决方案

配置 --hash-styleboth

+
1
LDFLAGS += -Wl,--hash-style=both
+ +

参考

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2020/05/14/ld-hash-style/ +

发表日期:2020/05/14 15:05

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 问题
  2. 2. 名词解释
  3. 3. 实验
  4. 4. 分析
  5. 5. 结论
  6. 6. 解决方案
  7. 7. 参考
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2020/07/03/gudie-of-technical-resume/index.html b/2020/07/03/gudie-of-technical-resume/index.html new file mode 100644 index 000000000..2efdb78e6 --- /dev/null +++ b/2020/07/03/gudie-of-technical-resume/index.html @@ -0,0 +1,2083 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + 写好技术简历的一些建议 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + 写好技术简历的一些建议 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + + + + + +
+ + + + +
+ 字数统计: 1.5k阅读时长: 29 min +
+ +
+ + + 2020/07/03 + + + + +
+
+ +
+
+ + + + +
+
+
+

根据我求职与招聘的经验,结合网上相关资料,这里整理了一些写好技术简历的建议。

+ + +
+

这里提供了一份简历模版,可供参考。

+
+

保证内容真实性

写简历必须要保证内容的真实性,这是候选人个人诚信的体现,无论在简历中如何自夸,最终会在面试过程中也会露怯;同时现在大部分企业在招聘时,都会进行背调,所以请务必保证简历内容包括面试过程的真实性,实事求是,“知之为知之,不知为不知”

+

项目描述不是流水账

对于技术人员来说,项目经历是简历的主体,也是简历中最需要突出的部分,项目中涉及的技能和成果等,是对求职者能力最具说服力的证明。

+

据说,谷歌要求求职者描述项目经历时,必须提供下面三个信息:

+
    +
  • 做了什么产品
  • +
  • 用到了什么技术
  • +
  • 取得了什么结果(量化
  • +
+

这里我认为还可以增加一个信息,即在项目中的角色:

+
    +
  • 独立完成开发
  • +
  • 协作开发,为主导开发,或辅助开发
  • +
  • 团队领导者,团队规模为多少人
  • +
+

比如,”在 xx 产品中,主导开发了 xx 功能,使用了 xx 技术,解决了 xx 问题,带来了 xx 增长或收入”。

+
+

特别需要注意的是,取得的结果一定要量化,如功能被多少人使用、性能提升多少倍、节约了多少成本、带来了多少收益等等

+
+

除此之外,还请注意下面几点:

+
    +
  • 挑选近 3~5 年内的项目,除非特别有价值,否则不要描述过于旧的项目;
  • +
  • 将项目分类,每类挑选 2~3 个核心的项目详细描述,其余可一笔带过;
  • +
  • 量化项目结果时,注重实际收益,如用户增长、经济收益等;
  • +
+

筛选专业技能

我遇到过很多刚毕业或毕业不久的求职者,简历中的专业技能十分齐全,但是面试过程中却发现大多的技能,仅仅是接触过或者在学校学过,这会给人感觉“你什么都会一点,但是什么都不精通”,这样做的伤害大于帮助。

+

所以,请筛选你的专业技能,建议可以按照熟练程度进行分类:

+
    +
  • 了解:有使用过该技能做过一点东西,清楚其使用场景、能够解决的问题;若面试官提及,能够接上话;
  • +
  • 熟悉:经常性使用该技能、以该技能为主进行研发,对其原理有初步了解;若面试官提及,能够有来有回的聊起来;
  • +
  • 精通(慎用):熟练使用该技能,对其原理理解透彻;若面试官提及,能够直接碾压他!
  • +
+

最后,与专业无关的技能切勿出现在简历中,那这些内容对企业没用,缺乏针对性,只会浪费简历空间,如在校上过的课程、得过的奖学金、当过学生会干部,会计证、驾驶证、英语四六级考试等。

+

具有岗位相关性

企业招聘的目的,是希望找到能够帮助它干活或解决问题的人,仅仅通过一份简历,它也没有把握什么样的人匹配这个岗位,所以它只能假设如果你掌握了这个岗位所需要的某几种核心专业技能,你就是初步合格的候选人。

+

所以简历应该针对每个应聘的岗位,突出该岗位所需要的项目经历和专业技能,来证明你可以胜任这份工作。

+

页数不超过三页

简历是求职者用来向企业传递信息的,一般来说企业招聘人员在筛选简历时,阅读简历的时间不会超过半分钟,如果看不到想要的点,就会直接 pass;所以一定要突出重点内容,不要写得密密麻麻,堆砌各种无关的信息,这样只会增加简历的阅读难度,让招聘人员抓不到重点,对于技术人员来说,重点就是你的项目经历以及专业技能。

+

避免错别字和语法错误

简历中应该避免出现错别字、语法错误等低级错误,这很有可能会给企业留下不严谨、做事马虎的印象;同时技术名词大小写也应该遵循业内规范,保持专业性。

+

如果对自己不放心,可以在发送简历之前,请朋友检查一遍简历。

+

自我评价

一般简历中,都会要求候选人进行自我评价,请注意不要描述自己的工作态度,如积极进取、工作努力等,这是默认应该做到的,不是加分项。
自我评价可以针对如下四点进行:

+
    +
  • 学习能力
  • +
  • 沟通能力
  • +
  • 协作能力
  • +
  • 执行能力
  • +
+

优化细节

优化企业招聘人员在阅读简历时的体验,使你的简历比别人读起来更舒服,自然简历通过的机会也会更高,可以关注以下细节:

+
    +
  • 在各类联系方式后面,注明最优联系时间,以免错过面试邀约;
  • +
  • 若手机为外地号码,最好注明;
  • +
  • 简历使用 markdown 编写,转换成 pdf 格式发出,可以避免样式丢失或格式不兼容;
  • +
+

写在最后

重中之重,还是需要提高自己的能力,正所谓 “酒香不怕巷子深“

+

Reference

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2020/07/03/gudie-of-technical-resume/ +

发表日期:2020/07/03 11:07

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 保证内容真实性
  2. 2. 项目描述不是流水账
  3. 3. 筛选专业技能
  4. 4. 具有岗位相关性
  5. 5. 页数不超过三页
  6. 6. 避免错别字和语法错误
  7. 7. 自我评价
  8. 8. 优化细节
  9. 9. 写在最后
  10. 10. Reference
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2020/09/29/git-help-v3/git-work-flow.jpg b/2020/09/29/git-help-v3/git-work-flow.jpg new file mode 100644 index 000000000..728e6118d Binary files /dev/null and b/2020/09/29/git-help-v3/git-work-flow.jpg differ diff --git a/2020/09/29/git-help-v3/index.html b/2020/09/29/git-help-v3/index.html new file mode 100644 index 000000000..0d94b2403 --- /dev/null +++ b/2020/09/29/git-help-v3/index.html @@ -0,0 +1,2385 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Git速查手册(第三版) · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + Git速查手册(第三版) + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 4.3k阅读时长: 94 min +
+ +
+ + + 2020/09/29 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文是对Git速查手册(第二版)的更新,补充了一些近期使用或者收集的一些命令。

+ + +

下载与安装

Git下载地址:https://git-scm.com/downloads,安装请参考页面说明。

+
+

建议使用版本v1.8及以上。

+
+

配置

Git配置分为三个级别:

+
    +
  • --system:系统级,位于 /etc/gitconfig
  • +
  • --global:用户级,位于 ~/.gitconfig
  • +
  • --local:仓库级,位于 [repo]/.git/config,为默认级别且优先级最高
  • +
+

用户信息

删除global用户信息,防止不同Git服务之间冲突:

+
1
2
$ git config --global --unset user.name
$ git config --global --unset user.email
+ +

配置用户名:

+
1
2
$ git config --local user.name "username"
$ git config --local user.email "email"
+ +

克隆协议

一般Git服务默认都支持SSHHTTPSSSH支持的原生Git协议速度最快,HTTPS除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令。

+

SSH

检查本机SSH公钥,若存在,则将id_rsa.pub添加到Git服务的SSH keys

+
1
$ ls ~/.ssh
+ +

若不存在,则生成:

+
    +
  • 单个Git服务
    1
    $ ssh-keygen -t rsa -C "your_email@youremail.com"
  • +
  • 多个Git服务
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    $ ssh-keygen -t rsa -C "your_email@youremail.com" -f "git1_id_rsa"
    $ ssh-keygen -t rsa -C "your_email@youremail.com" -f "git2_id_rsa"
    $ cp git1_id_rsa* ~/.ssh/
    $ cp git2_id_rsa* ~/.ssh/

    # 创建配置文件
    $ vi ~/.ssh/config

    # git1
    Host git1.com
    HostName git1.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/git1_id_rsa

    # git2
    Host git2.com
    HostName git2.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/git2_id_rsa
  • +
+

配置完成后,将对应的id_rsa.pub添加到Git服务的SSH keys,再次检查ssh连接情况;若不生效,则重启后再尝试:

+
1
2
$ ssh -T git@github.com
Hi! You’ve successfully authenticated, but GitHub does not provide shell access.
+
+

若出现上述信息,则表示设置成功。

+
+

克隆:

+
1
$ git clone git@git.server:test.git
+ +

HTTPS

关闭ssl校验:

+
1
$ git config --global http.sslverify false
+ +

克隆:

+
1
$ git clone https://git.server/test.git
+ +

协议切换

查看当前协议:

+
1
$ git remote -v
+ +

https切换至ssh

+
1
git remote set-url origin git@domain:username/ProjectName.git
+ +

ssh切换至https

+
1
git remote set-url origin https://domain/username/ProjectName.git
+ +

自定义配置

超时时间

1
$ git config --global credential.helper 'cache --timeout=3600'
+ +

保存用户凭证

1
$ git config --global credential.helper store
+

执行后,下次操作输入的用户名和密码会被保存,后续不必手动输入用户名和密码。若同时使用不同的Git服务,则不推荐使用。

+

多Git服务

若同时使用不同的Git服务,可以根据目录配置用户信息(需要使用v2.13.0及以上版本):

+
    +
  • 首先修改用户目录下的 .gitconfig,通过 includeIf 配置不同目录的配置文件:

    +
    1
    2
    3
    4
    5
    6
    7
    8
    - [user]
    - name = weijie.yuan
    - email = weijie.yuan@gitlab.com

    + [includeIf "gitdir:~/github/"]
    + path = .gitconfig-github
    + [includeIf "gitdir:~/gitlab/"]
    + path = .gitconfig-gitlab
    +
  • +
  • 根据配置的 path,分别创建 .gitconfig-github 文件和 .gitconfig-gitlab 文件:

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ vi .gitconfig-github
    [user]
    name = weijie.yuan
    email = weijie.yuan@github.com

    $ vi .gitconfig-gitlab
    [user]
    name = weijie.yuan
    email = weijie.yuan@gitlab.com
    +

    includeIf 配置有如下规则:

    +
  • +
  • 家目录下的 .gitconfigincludeIf 后面的 path 最后需要 / 结尾;

    +
  • +
  • 家目录下的 .gitconfig ,原有的 user 部分需要删除;

    +
  • +
  • 家目录下的 .gitconfigincludeIf中配置的各个目录,不能是包含关系;

    +
  • +
+

文本编辑器

Linux or MacOS

+
1
$ git config --global core.editor vim
+

Windows

+
1
> git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"
+ +

文本比较合并工具

查看支持的工具集合(推荐使用meld):

+
1
$ git difftool --tool-help
+ +

Linux or MacOS

+
1
2
$ git config --global diff.tool meld
$ git config --global merge.tool meld
+ +

Windows

+
1
2
3
4
5
> git config --global diff.tool meld
> git config --global merge.tool meld
> git config --global difftool.bc3.path 'C:\Program Files (x86)\Meld\Meld.exe'
> git config --global mergetool.meld.path 'C:\Program Files (x86)\Meld\Meld.exe'
> git config --global difftool.meld.path 'C:\Program Files (x86)\Meld\Meld.exe'
+ +

显示颜色

1
$ git config --global color.ui.true
+ +

操作别名

示例,将checkout设置为别名co

+
1
$ git config --global alias checkout co 
+ +

查看所有配置

1
2
3
$ git config --local --list
$ git config --global --list
$ git config --system --list
+ +

基础操作

工作流

工作流

+

工作区就是你的本地仓库目录,不过其中的.git目录不属于工作区,而是版本库,里面存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

+

查看状态:

+
1
$ git status
+ +

添加修改到暂存区:

+
1
2
3
$ git add <filename> 
$ git add . # 添加当前目录所有修改过的文件
$ git add * # 递归地添加执行命令时所在的目录中的所有文件
+ +

提交修改到版本库:

+
1
2
$ git commit -m "commit message"
$ git commit -am "commit message" # am:将添加和提交合并为一步,但只对本来就存在的文件有效
+
+

commit message的填写可以参考写好 Git Commit 信息的 7 个建议

+
+

现在来解释一下前面的添加和提交操作:

+
    +
  1. git add:把文件修改添加到暂存区;
  2. +
  3. git commit:把暂存区的所有内容提交到当前分支,即版本库;
  4. +
+

版本历史记录

查看当前仓库所有文件的版本历史记录:

+
1
$ git log
+ +

查看每个文件的版本历史记录:

+
1
$ git log <filename>
+ +

查看包含指定关键字的版本历史记录:

+
1
$ git log --grep="keywords"
+ +

查看指定时间段的版本历史记录,如下示例时间段为2020.9.23全天:

+
1
$ git log --after="2020-9-23 00:00:00" --before="2020-9-23 23:59:59"
+ +

暂存

当你需要切换分支时,若当前工作区还有些修改没有完成、又不适合提交的,操作切换分支是会提示出错的,这时就需要将这些修改暂存起来:

+
1
$ git stash save "message"
+ +

查看:

+
1
$ git stash list
+ +

恢复:

+
1
2
3
$ git stash pop [--index] [stash@{num}] 
or
$ git stash apply [--index] [stash@{num}] # 不删除已恢复的进度.
+
+

--index表示不仅恢复工作区,还会恢复暂存区;num是你要恢复的操作的序列号,默认恢复最新进度。

+
+

删除进度:

+
1
2
$ git stash drop [stash@{num}] # 删除指定进度
$ git stash clear # 删除所有
+ +

撤销与回退

查看当前仓库状态:

+
1
$ git status
+ +

查看文件更改:

+
1
2
$ git difftool <filename>
$ git mergetool <filename>
+ +

查看提交历史:

+
1
2
$ git log
$ git log --pretty=oneline #只保留commit id 和 commit message
+ +

撤销工作区Tracked files的修改:

+
1
$ git checkout -- <filename>
+ +

撤销工作区Untracked files的修改:

+
    +
  • n:查看将会删除的文件,防止误删;
  • +
  • f:Untracked的文件;
  • +
  • d:Untracked的目录;
  • +
  • x:包含gitignoreUntracked文件和目录一并删掉,慎用!;
  • +
+
1
git clean -nfd
+ +

只回退暂存区(git add),不删除工作空间代码:

+
1
$ git reset HEAD <filename> # 无filename则默认回退全部 
+ +

回退版本区(git commit)和暂存区(git add),不删除工作空间代码:

+
1
2
$ git reset --mixed HEAD^ # --mixed为默认参数
$ git reset HEAD^
+ +

回退版本区(git commit),但是不回退暂存区(git add),不删除工作空间代码:

+
1
$ git reset --soft HEAD^
+ +

回退版本区(git commit)和暂存区(git add),并删除工作空间代码(不包括Untracked files),执行后直接恢复到指定<commit-id>状态:

+
1
$ git reset --hard <commit-id>
+
+

HEAD表示当前版本,HEAD^表示上个版本,HEAD^^表示上上个版本,上100个版本可以表示为HEAD~100以此类推。

+
+

回退版本后,若需要返回原来的版本,会发现找不到未来的commit id,则需要查看操作命令历史进行查找:

+
1
$ git reflog
+ +

从版本库删除文件:

+
1
$ git rm <filename>
+ +

若你的代码已经push到线上,则推荐使用下面这个命令回滚:

+
1
$ git revert <commit-id>
+
+

revert是用一次新的commit来回滚之前的commit,更安全;reset则是直接删除指定的commit,若直接push会导致冲突。

+
+

使用帮助

查看帮助:

+
1
$ git --help
+ +

仓库管理

推送本地修改到远程仓库

1
$ git push -u origin <feature-branch-name>
+
+

-u选项可以将本地分支与远程分支关联,下次git pull操作时可以不带参数.具体参见这里

+
+

添加本地仓库到远程

1
2
3
$ cd repo
$ git init
$ git remote add origin git@github.com:USERNAME/repo.git
+
+

origin就是一个名字,是git为你默认创建的指向这个远程代码库的标签。

+
+

获取远程仓库

1
$ git clone git@github.com:USERNAME/repo.git
+ +

查看远程仓库

1
2
3
$ git remote -v
origin git@github.com:USERNAME/repo.git (push)
origin git@github.com:USERNAME/repo.git (fetch)
+ +

关联远程仓库

1
$ git remote add upstream git@github.com:USERNAME/repo.git
+ +

同步远程仓库的更新

1
2
3
4
5
6
7
8
9
10
$ git remote -v
origin git@github.com:USERNAME/repo.git (push)
origin git@github.com:USERNAME/repo.git (fetch)
upstream git@github.com:USERNAME/repo.git (push)
upstream git@github.com:USERNAME/repo.git (fetch)

$ git fetch upstream
$ git difftool <branch-name> upstream/master
$ git merge upstream/master
$ git mergetool
+ +

仓库引用(自仓库)

Git包含submodulesubtree两种引用方式,官方推荐使用subtree替代submodule

+

submodule

添加子模块
1
$ git submodule add git@github.com:USERNAME/repo.git <submodule-path>
+

执行成功后,暂存区会有两个修改:.gitmodules和命令中<submodule-path>指定的路径。

+

提交更新:

+
1
2
$ git commit
$ git push
+ +
使用子模块

克隆使用了子模块的项目后,默认其子模块目录为空,需要在项目根目录执行如下命令单独下载:

+
1
2
3
4
5
6
$ git submodule update --init --recursive

or

$ git submodule init
$ git submodule update
+ +
更新子模块

子模块仓库更新后,使用子模块的项目必须手动更新才能同步最新的提交:

+
1
2
$ cd <submodule-path>
$ git pull
+ +

完成后返回项目根目录,可以看到子模块有待提交的更新,执行提交即可:

+
1
2
3
$ git add .
$ git commit
$ git push
+ +
删除子模块

删除子模块目录及源码:

+
1
$  rm -rf <submodule-path>
+ +

删除项目根目录下.gitmodules文件中待删除的子模块相关条目:

+
1
$ vi .gitmodules 
+ +

删除版本库下的子模块目录,每个子模块对应一个目录,只删除对应的子模块目录即可:

+
1
rm -rf .git/module/<submodule-path>
+ +

删除子模块缓存:

+
1
git rm --cached <submodule-path>
+ +

提交更新:

+
1
2
3
$ git add .
$ git commit
$ git push
+ +

subtree

1
2
3
4
5
6
7
8
9
# 第一次初始化
$ git remote add -f <remote-subtree-repository-name> <remote-subtree-repository-url>
$ git subtree add --prefix=<local-subtree-directory> <remote-subtree-repository> <remote-subtree-branch-name> --squash

# 同步subtree的更新
$ git subtree pull --prefix=<local-subtree-directory> <remote-subtree-repository> <remote-subtree-branch-name> --squash

# 推送到远程subtree库
$ git subtree push --prefix=<local-subtree-directory> <remote-subtree-repository> <remote-subtree-branch-name>
+ +

清理仓库

清理本地无效的远程追踪分支

1
2
3
$ git pull # 拉取更新
$ git remote prune origin --dry-run # 列出所有可以从本地仓库中删除的远程追踪分支
$ git remote prune origin # 清理本地无效的远程追踪分支
+ +

清理无用的分支和标签

1
2
$ git branch -d <branch-name>
$ git tag -d <tag-name>
+ +

清理大文件

    +
  • 查看仓库占用空间:

    +
    1
    2
    $ git count-objects -v
    $ du -sh .git
    +
  • +
  • 寻找大文件ID

    +
    1
    $ git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10
    +
    +

    输出的第一列是文件ID,第二列表示文件(blob)或目录(tree),第三列是文件大小,此处筛选了最大的10条。

    +
    +
  • +
  • 根据文件ID映射文件名:

    +
    1
    $ git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}')"
    +
  • +
  • 根据文件名,从所有提交中删除文件:

    +
    1
    $ git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch [FileName]' --prune-empty --tag-name-filter cat -- --all
    +
  • +
  • 删除缓存下来的refgit操作记录:

    +
    1
    2
    $ git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
    $ git reflog expire --expire=now --all
    +
  • +
  • 清理.git目录并推送到远程:

    +
    1
    2
    $ git gc --prune=now
    $ git push -f --all
    +
    +

    在执行push操作时,git会自动执行一次gc操作,不过只有loose object达到一定数量后才会真正调用,建议手动执行。

    +
    +
  • +
  • 重新查看仓库占用空间,发现较清理前变小很多:

    +
    1
    2
    $ git count-objects -v
    $ du -sh .git
  • +
+

清理大型二进制文件

由于Git在存储二进制文件时效率不高,所以需要借助第三方组件

+

分支管理

查看分支

查看所有分支:

+
1
$ git branch -a
+
+

*标记的是当前分支。

+
+

查看某个<commit id>属于哪个分支:

+
1
$ git branch -a --contains <commit id>
+ +

创建分支

在本地创建分支:

+
1
$ git branch <newbranch> # 创建
+ +

在本地创建分支并切换:

+
1
$ git checkout -b <newbranch> # 创建并切换
+ +

从标签创建分支:

+
1
2
$ git branch <newbranch> <tagname>
$ git checkout <newbranch> # 切换到新建分支
+ +

获取远程分支到本地并创建本地分支:

+
1
$ git checkout -b <local-branch> <remote-branch>
+ +

推送新建本地分支到远程:

+
1
2
3
$ git push -u origin <remote-branch-name>
or
$ git push --set-upstream origin <remote-branch-name>
+ +

创建空白分支

创建一个分支,该分支会包含父分支的所有文件,但不会指向任何历史提交:

+
1
$ git checkout --orphan <newbranch>
+ +

删除所有文件:

+
1
$ git rm -rf .
+ +

提交分支:

+
1
2
3
4
$ echo '# new branch' >> README.md
$ git add README.md
$ git commit
$ git push origin <remote-branch-name>
+ +

删除分支

删除本地分支:

+
1
$ git branch -d <branch>
+
+

若当前分支因为有修改未提交或其它情况不能删除,请使用-D选项强制删除。

+
+

清理无用的本地分支:

+
1
$ git remote prune origin
+
+

通常在remote上的分支被删除后,更新本地分支列表时使用。

+
+

删除远程分支(三种方法):

+
1
2
3
$ git push origin --delete <remote-branch-name>
$ git push origin -d <remote-branch-name>
$ git push origin :<remote-branch-name>
+ +

更新分支

获取远程分支到本地已有分支:

+
1
$ git branch --set-upstream <local-branch> origin/branch
+ +

同步当前分支的所有更新,使用git pull并不保险:

+
1
2
3
4
5
6
7
8
# 下载最新的代码到远程跟踪分支, 即origin/<branch-name>
$ git fetch origin <branch-name>
# 查看更新内容
$ git difftool <branch-name> origin/<branch-name>
# 尝试合并远程跟踪分支的代码到本地分支
$ git merge origin/<branch-name>
# 借助mergetool解决冲突
$ git mergetool
+ +

同步其它分支的所有更新,本例拉取master分支更新:

+
1
2
3
4
$ git fetch origin master
$ git difftool <branch-name> origin/master
$ git merge origin/master
$ git mergetool
+ +

同步其它分支的部分更新,即同步某几次提交:

+
1
2
3
4
5
6
7
8
# 同步提交A
$ git cherry-pick <commit id A>
# 同步提交A和B
$ git cherry-pick <commit id A> <commit id B>
# 同步提交A到B的所有提交(不包括A),提交A必须早于提交B,否则命令将失败,但不会报错
$ git cherry-pick <commit id A>..<commit id B>
# 同步提交A到B的所有提交(包括A),提交A必须早于提交B,否则命令将失败,但不会报错
$ git cherry-pick <commit id A>^..<commit id B>
+ +

标签管理

查看标签

1
$ git tag
+ +

创建标签

1
2
$ git tag -a <tagname> -m "tag message" # 创建标签在当前最新提交的commit上
$ git tag -a <tagname> -m "tag message" <commit id> # 创建标签在指定的commit上
+
+

若创建标签基于的commit被删除,标签不会被影响,依旧存在。

+
+

推送标签

推送标签到远程服务器:

+
1
2
$ git push origin <tagname> # 推送一个本地标签
$ git push origin --tags # 推送全部未推送过的本地标签
+ +

删除标签

1
2
$ git tag -d <tagname> # 删除一个本地标签
$ git push origin :refs/tags/<tagname> # 删除一个远程标签
+ +

进阶技巧

忽略特殊文件

当你的仓库中有一些文件,类似密码或者数据库文件不需要提交但又必须放在仓库目录下,每次git status都会提示Untracked,看着让人很不爽,提供两种方法解决这个问题。

+

本地忽略

在代码仓库目录创建一个.gitignore文件,编写规则如下:

+
1
2
3
tmp/  # 忽略tmp文件夹下所有内容
*.ini # 忽略所有ini文件
!data/ #忽略除了data文件夹的所有内容
+
+

.gitignore模版

+
+

全局忽略

在用户目录创建一个.gitignore_global文件,编写规则同.gitignore,并修改~/.gitconfig

+
1
2
[core]
excludesfile = ~/.gitignore_global
+ +

如果添加的忽略对象已经Tracked,纳入了版本管理中,则需要在代码仓库中先把本地缓存删除,改变成Untracked状态:

+
1
$ git rm -r --cached .
+ +

重写历史(慎用!)

修改历史提交(变基)

1
2
$ git rebase -i [git-hash| head~n]
$ git push -f # 不强制 push 会多一条 merge 提交信息
+

其中git-hash是你要开始进行rebasecommithash,而head~n则是从HEAD向前推ncommit

+

修改最近一次提交信息

1
$ git commit --amend
+ +

修改提交记录中的用户信息

修改最近一次提交的用户信息:

+
1
$ git commit --amend --author="GIT_AUTHOR_NAME <GIT_AUTHOR_EMAIL>"
+ +

全局修改用户信息:

+
1
2
3
4
5
6
7
8
9
$ git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_EMAIL" = "xxx@localhost" ];
then
GIT_AUTHOR_NAME="xxx";
GIT_AUTHOR_EMAIL="xxx@example.com";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD --all
+ +

Reference

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2020/09/29/git-help-v3/ +

发表日期:2020/09/29 15:09

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 下载与安装
  2. 2. 配置
    1. 2.1. 用户信息
    2. 2.2. 克隆协议
      1. 2.2.1. SSH
      2. 2.2.2. HTTPS
      3. 2.2.3. 协议切换
    3. 2.3. 自定义配置
      1. 2.3.1. 超时时间
      2. 2.3.2. 保存用户凭证
      3. 2.3.3. 多Git服务
      4. 2.3.4. 文本编辑器
      5. 2.3.5. 文本比较合并工具
      6. 2.3.6. 显示颜色
      7. 2.3.7. 操作别名
    4. 2.4. 查看所有配置
  3. 3. 基础操作
    1. 3.1. 工作流
    2. 3.2. 版本历史记录
    3. 3.3. 暂存
    4. 3.4. 撤销与回退
    5. 3.5. 使用帮助
  4. 4. 仓库管理
    1. 4.1. 推送本地修改到远程仓库
    2. 4.2. 添加本地仓库到远程
    3. 4.3. 获取远程仓库
    4. 4.4. 查看远程仓库
    5. 4.5. 关联远程仓库
    6. 4.6. 同步远程仓库的更新
    7. 4.7. 仓库引用(自仓库)
      1. 4.7.1. submodule
        1. 4.7.1.1. 添加子模块
        2. 4.7.1.2. 使用子模块
        3. 4.7.1.3. 更新子模块
        4. 4.7.1.4. 删除子模块
      2. 4.7.2. subtree
    8. 4.8. 清理仓库
      1. 4.8.1. 清理本地无效的远程追踪分支
      2. 4.8.2. 清理无用的分支和标签
      3. 4.8.3. 清理大文件
      4. 4.8.4. 清理大型二进制文件
  5. 5. 分支管理
    1. 5.1. 查看分支
    2. 5.2. 创建分支
    3. 5.3. 创建空白分支
    4. 5.4. 删除分支
    5. 5.5. 更新分支
  6. 6. 标签管理
    1. 6.1. 查看标签
    2. 6.2. 创建标签
    3. 6.3. 推送标签
    4. 6.4. 删除标签
  7. 7. 进阶技巧
    1. 7.1. 忽略特殊文件
      1. 7.1.1. 本地忽略
      2. 7.1.2. 全局忽略
    2. 7.2. 重写历史(慎用!)
      1. 7.2.1. 修改历史提交(变基)
      2. 7.2.2. 修改最近一次提交信息
      3. 7.2.3. 修改提交记录中的用户信息
  8. 8. Reference
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2021/02/22/difference-between-RPATH-and-RUNPATH/index.html b/2021/02/22/difference-between-RPATH-and-RUNPATH/index.html new file mode 100644 index 000000000..7d1cc6c0e --- /dev/null +++ b/2021/02/22/difference-between-RPATH-and-RUNPATH/index.html @@ -0,0 +1,2105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + RPATH与RUNPATH的区别 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + RPATH与RUNPATH的区别 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + + + + + +
+ + + + +
+ 字数统计: 1.6k阅读时长: 36 min +
+ +
+ + + 2021/02/22 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文从一个实际遇到的问题出发,分析 RPATHRUNPATH 的区别,以及产生的原因。

+ + +

RPATH与RUNPATH的区别

年前升级了操作系统后,同样的代码在新系统编译后无法执行,提示找不到依赖库,本文用来记录一下是如何解决这个问题的。

+

源文件

main.c

+
1
2
3
4
5
6
#include "a.h"

int main() {
a();
return 0;
}
+

libA.so

+
1
2
3
4
5
6
// a.c
#include "b.h"

void a() {
b();
}
+
1
2
// a.h
void a();
+

ubuntu 16.04(gcc version 5.4.0)

+
1
$ gcc -fPIC -shared a.c -I. -L. -lB -o libA.so
+

libB.so

+
1
2
3
4
5
6
// b.c
#include <stdio.h>

void b() {
printf("Hello, World\n");
}
+
1
2
// b.h
void b();
+

ubuntu 16.04(gcc version 5.4.0)

+
1
$ gcc -fPIC -shared -I. b.c -o libB.so
+ + +
+

**函数调用依赖关系:main -> a -> b**。

+
+

复现步骤

    +
  1. 分别在 ubuntu 16.04(gcc version 5.4.0)ubuntu 20.04(gcc version 9.3.0) 编译可执行程序:

    +
    1
    $ gcc -I. -o main main.c -Wl,--rpath,. -L. -lA -lB
    + +
  2. +
  3. ubuntu 16.04(gcc version 5.4.0) 运行成功

    +
    1
    2
    $ ./main
    Hello, World
    +
  4. +
  5. ubuntu 20.04(gcc version 9.3.0) 运行失败

    +
    1
    2
    $ ./main 
    ./main: error while loading shared libraries: libB.so: cannot open shared object file: No such file or directory
    +
    +

    错误提示为找不到可执行程序 ./main 依赖的共享库 libB.so

    +
    +
  6. +
+

问题原因

排除共享库本身问题

首先,由于 libA.solibB.so 是在 ubuntu 16.04(gcc version 5.4.0) 上编译的,所以重新在ubuntu 20.04(gcc version 9.3.0) 上编译 libA.solibB.so,并重复复现步骤,现象相同,说明不是 libA.solibB.so 导致的问题;

+

分析库查找过程

使用 **LD_DEBUG**,打开链接器的调试功能,分析共享库的查找过程:
ubuntu 16.04(gcc version 5.4.0)

+
1
2
3
4
5
6
7
8
9
10
11
$ LD_DEBUG=libs ./main                                                        [16:37:15]
22331: find library=libA.so [0]; searching
22331: search path=./tls/x86_64:./tls:./x86_64:. (RPATH from file ./main)
......
22331: trying file=./libA.so
......
22331: find library=libB.so [0]; searching
22331: search path=./tls/x86_64:./tls:./x86_64:. (RPATH from file ./main)
......
22331: trying file=./libB.so
......
+

ubuntu 20.04(gcc version 9.3.0)

+
1
2
3
4
5
6
7
8
9
10
11
12
$ LD_DEBUG=libs ./main
33218: find library=libA.so [0]; searching
33218: search path=./tls/haswell/x86_64:./tls/haswell:./tls/x86_64:./tls:./haswell/x86_64:./haswell:./x86_64:. (RUNPATH from file ./main)
......
33218: trying file=./libA.so
......
33218: find library=libB.so [0]; searching
33218: search cache=/etc/ld.so.cache
33218: search path=/lib/x86_64-linux-gnu/tls/haswell/x86_64:/lib/x86_64-linux-gnu/tls/haswell:/lib/x86_64-linux-gnu/tls/x86_64:/lib/x86_64-linux-gnu/tls:/lib/x86_64-linux-gnu/haswell/x86_64:/lib/x86_64-linux-gnu/haswell:/lib/x86_64-linux-gnu/x86_64:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu/tls/haswell/x86_64:/usr/lib/x86_64-linux-gnu/tls/haswell:/usr/lib/x86_64-linux-gnu/tls/x86_64:/usr/lib/x86_64-linux-gnu/tls:/usr/lib/x86_64-linux-gnu/haswell/x86_64:/usr/lib/x86_64-linux-gnu/haswell:/usr/lib/x86_64-linux-gnu/x86_64:/usr/lib/x86_64-linux-gnu:/lib/tls/haswell/x86_64:/lib/tls/haswell:/lib/tls/x86_64:/lib/tls:/lib/haswell/x86_64:/lib/haswell:/lib/x86_64:/lib:/usr/lib/tls/haswell/x86_64:/usr/lib/tls/haswell:/usr/lib/tls/x86_64:/usr/lib/tls:/usr/lib/haswell/x86_64:/usr/lib/haswell:/usr/lib/x86_64:/usr/lib (system search path)
......
./main: error while loading shared libraries: libB.so: cannot open shared object file: No such file or directory

+

结果在 ubuntu 20.04(gcc version 9.3.0) 中, 可以正确查找到 libA.so ,但是无法正确查找到 libB.so
libB.so 的查找路径是 system search path ,而非我们在编译时设定的查找时路径 ./ ,导致可执行程序无法加载 libB.so

+
+

动态链接器对共享库的查找顺序:

+
    +
  1. LD_LIBRARY_PATH-L-rpath
  2. +
  3. /etc/ld.so.cache
  4. +
  5. 默认共享库目录:/usr/lib/lib
  6. +
+
+

RPATH与RUNPATH的区别

由上分析可以得出是共享库运行时加载路径非法导致的问题,在排除设置 LD_LIBRARY_PATH 等环境变量的情况下,可以将焦点锁定在使用的链接选项 -rpath 上,查看源文件依赖:
ubuntu 16.04(gcc version 5.4.0)

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ readelf -d main
Dynamic section at offset 0xe08 contains 26 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libA.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000f (RPATH) Library rpath: [.]

$ readelf -d libA.so
Dynamic section at offset 0xe08 contains 25 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libB.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]

$ readelf -d libB.so
Dynamic section at offset 0xe18 contains 24 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
+

ubuntu 20.04(gcc version 9.3.0)

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ readelf -d main 
Dynamic section at offset 0x2da8 contains 29 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libA.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000001d (RUNPATH) Library runpath: [.]

$ readelf -d libA.so
Dynamic section at offset 0xe08 contains 25 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libB.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]

$ readelf -d libB.so
Dynamic section at offset 0xe18 contains 24 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
+

发现在 ubuntu 20.04(gcc version 9.3.0)RPATH 变成了 RUNPATH ,说明链接器选项 -rpath 的行为发生了改变。

+
+

源文件依赖关系:main -> libA.so -> libB.so

+
+

综上,问题的原因是 ubuntu 20.04(gcc version 9.3.0) 上,链接器选项 -rpath 的行为发生改变,默认配置为 RUNPATH 而不是 RPATH;由于 RUNPATH 不适用于间接依赖的库,所以导致在 ubuntu 20.04(gcc version 9.3.0) 上只能正确查找到 libA.so ,而无法正确查找到 libB.so

+
+

gcc version >= 7.5.0时,-rpath默认行为即发生改变。

+
+

解决方案

LD_LIBRARY_PATH(不推荐)

LD_LIBRARY_PATH 是一个环境变量,作用是临时改变链接器的加载路径,可以存储多个路径,用冒号分隔:

+
1
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./libs
+

不推荐的原因:

+
    +
  1. 若全局设置 LD_LIBRARY_PATH,会影响其它应用程序的共享库加载过程;
  2. +
  3. 若只在该应用程序启动时局部设置 LD_LIBRARY_PATH,则每次启动都需要设置,步骤过于繁琐;
  4. +
+

–disable-new-dtags

可以使用 -Wl,--disable-new-dtags 选项来使链接器保持旧行为,即在 ubuntu 20.04(gcc version 9.3.0) 使用如下命令编译:

+
1
$ gcc -I. -o main main.c -Wl,--disable-new-dtags,--rpath,. -L. -lA -lB
+

重新运行并查看依赖:

+
1
2
3
4
5
6
7
8
9
$ ./main 
Hello, World

$ readelf -d main
Dynamic section at offset 0x2da8 contains 29 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libA.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000f (RPATH) Library rpath: [.]
+

可执行程序 main 可以正确运行,RUNPATH 也变成了 RPATH,链接器行为与 ubuntu 16.04(gcc version 5.4.0) 保持一致了。

+
+

同理,也有 -Wl,--enable-new-dtags 选项来使链接器保持新行为

+
+

如下为官方解释:

+
1
2
3
--enable-new-dtags
--disable-new-dtags
This linker can create the new dynamic tags in ELF. But the older ELF systems may not understand them. If you specify --enable-new-dtags, the new dynamic tags will be created as needed and older dynamic tags will be omitted. If you specify --disable-new-dtags, no new dynamic tags will be created. By default, the new dynamic tags are not created. Note that those options are only available for ELF systems.
+

参考

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2021/02/22/difference-between-RPATH-and-RUNPATH/ +

发表日期:2021/02/22 18:02

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. RPATH与RUNPATH的区别
    1. 1.1. 源文件
    2. 1.2. 复现步骤
    3. 1.3. 问题原因
      1. 1.3.1. 排除共享库本身问题
      2. 1.3.2. 分析库查找过程
      3. 1.3.3. RPATH与RUNPATH的区别
    4. 1.4. 解决方案
      1. 1.4.1. LD_LIBRARY_PATH(不推荐)
      2. 1.4.2. –disable-new-dtags
    5. 1.5. 参考
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2021/06/23/getrusage/index.html b/2021/06/23/getrusage/index.html new file mode 100644 index 000000000..75eae1c91 --- /dev/null +++ b/2021/06/23/getrusage/index.html @@ -0,0 +1,2092 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + getrusage-进程资源统计函数 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + getrusage-进程资源统计函数 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ + + + +
+ 字数统计: 1.3k阅读时长: 28 min +
+ +
+ + + 2021/06/23 + + + + +
+
+ +
+
+ + + + +
+
+
+

getrusage用于统计系统资源使用情况,即进程执行直到调用该函数时的资源使用情况,如果在不同的时间调用该函数,会得到不同的结果。

+ + +

简介

getrusage用于统计系统资源使用情况,即进程执行直到调用该函数时的资源使用情况,如果在不同的时间调用该函数,会得到不同的结果。

+
+

目前在LinuxmacOS支持该函数。

+
+

函数说明

原型

1
2
3
4
#include <sys/time.h>
#include <sys/resource.h>

int getrusage(int who, struct rusage *usage);
+
+

sys/time.h:为了得到timeval结构体的声明,这个结构体实际上在bits/time.h中声明。

+
+

参数

**who**:资源统计的对象,有如下取值:

+
    +
  • RUSAGE_SELF:返回调用进程的资源使用统计信息,即该进程中所有线程使用的资源总和;
  • +
  • RUSAGE_CHILDREN:返回调用进程所有已终止且被回收子进程的资源使用统计信息。如果进程有孙子进程或更远的后代进程,且这些后代进程和这些后代进程与调用进程之间的中间进程也已终止且被回收,那么这些后代进程的资源使用统计信息也会被统计;
  • +
  • RUSAGE_THREADLinux 2.6.26起支持):返回调用线程的资源使用统计信息;
  • +
+ + + + + + + + + + + + + + + + + + + +
宏定义取值
RUSAGE_SELF0
RUSAGE_CHILDREN-1
RUSAGE_THREAD1
+
+

宏定义在sys/resource.h-> bits/resource.h

+
+

**usage**:资源使用统计信息,用如下结构体的形式返回到该指针指向的内存空间:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct rusage {
struct timeval ru_utime; /* user CPU time used */
struct timeval ru_stime; /* system CPU time used */
long ru_maxrss; /* maximum resident set size */
long ru_ixrss; /* integral shared memory size */
long ru_idrss; /* integral unshared data size */
long ru_isrss; /* integral unshared stack size */
long ru_minflt; /* page reclaims (soft page faults) */
long ru_majflt; /* page faults (hard page faults) */
long ru_nswap; /* swaps */
long ru_inblock; /* block input operations */
long ru_oublock; /* block output operations */
long ru_msgsnd; /* IPC messages sent */
long ru_msgrcv; /* IPC messages received */
long ru_nsignals; /* signals received */
long ru_nvcsw; /* voluntary context switches */
long ru_nivcsw; /* involuntary context switches */
};
+

结构体struct rusage各个成员释义如下:

+
    +
  • ru_utime:返回进程在用户模式下的执行时间,以timeval结构的形式返回(该结构体在bits/timeval中声明);
  • +
  • ru_stime:返回进程在内核模式下的执行时间,以timeval结构的形式返回(该结构体在bits/timeval中声明);
  • +
  • ru_maxrssLinux 2.6.32起支持):返回rss(实际使用物理内存,包含共享库占用的内存)的大小,单位为KB;当who被指定为RUSAGE_CHILDREN时,返回各子进程rss的大小中最大的一个,而不是进程树中最大的rss
  • +
  • ru_ixrss:目前不支持;
  • +
  • ru_idrss:目前不支持;
  • +
  • ru_isrss:目前不支持;
  • +
  • ru_minflt:缺页中断的次数,且处理这些中断不需要进行I/O,不需要进行I/O操作的原因是系统使用reclaiming的方式在物理内存中得到了之前被淘汰但是未被修改的页框。(第一次访问bss段时也会产生这种类型的缺页中断);
  • +
  • ru_majflt:缺页中断的次数,且处理这些中断需要进行I/O
  • +
  • ru_nswap:目前不支持;
  • +
  • ru_inblockLinux 2.6.22起支持):文件系统需要进行输入操作的次数;
  • +
  • ru_oublockLinux 2.6.22起支持):文件系统需要进行输出操作的次数;
  • +
  • ru_msgsnd:目前不支持;
  • +
  • ru_msgrcv:目前不支持;
  • +
  • ru_nsignals:目前不支持;
  • +
  • ru_nvcswLinux 2.6起支持):因进程自愿放弃处理器时间片而导致的上下文切换的次数(通常是为了等待请求的资源);
  • +
  • ru_nivcswLinux 2.6起支持):因进程时间片使用完毕或被高优先级进程抢断导致的上下文切换的次数;
    +

    其中有些结构体成员目前并不被Linxu支持,但是为了兼容其它系统以及未来扩展,仍被保留了下来,这些结构体成员在函数执行后会被内核默认设置为0

    +
    +
  • +
+

返回值

成功0
失败-1,并设置errno的值,包含如下两种错误:

+
    +
  • EFAULTusage指针指向不可访问地址;
  • +
  • EINVALwho被指定为无效值;
  • +
+

属性

getrusage函数是线程安全的。

+

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>

/* include for getrusage */
#ifndef _WIN32
#include <sys/time.h>
#include <sys/resource.h>
#endif

static void print_rusage() {
#ifndef _WIN32
int ret;

struct rusage usage;
ret = getrusage(RUSAGE_SELF, &usage);
if (0 != ret) {
printf("getrusage failed\n");
goto end;
}

printf("%s: %.3fms\n", "ru_utime", (usage.ru_utime.tv_sec * 1000.0 + usage.ru_utime.tv_usec / 1000.0));
printf("%s: %.3fms\n", "ru_stime", (usage.ru_stime.tv_sec * 1000.0 + usage.ru_stime.tv_usec / 1000.0));
printf("%s: %.3fM\n", "ru_maxrss", (usage.ru_maxrss / 1024.0));
printf("%s: %ld\n", "ru_ixrss", usage.ru_ixrss);
printf("%s: %ld\n", "ru_idrss", usage.ru_idrss);
printf("%s: %ld\n", "ru_isrss", usage.ru_isrss);
printf("%s: %ld\n", "ru_minflt", usage.ru_minflt);
printf("%s: %ld\n", "ru_majflt", usage.ru_majflt);
printf("%s: %ld\n", "ru_nswap", usage.ru_nswap);
printf("%s: %ld\n", "ru_inblock", usage.ru_inblock);
printf("%s: %ld\n", "ru_oublock", usage.ru_oublock);
printf("%s: %ld\n", "ru_msgsnd", usage.ru_msgsnd);
printf("%s: %ld\n", "ru_msgrcv", usage.ru_msgrcv);
printf("%s: %ld\n", "ru_nsignals", usage.ru_nsignals);
printf("%s: %ld\n", "ru_nvcsw", usage.ru_nvcsw);
printf("%s: %ld\n", "ru_nivcsw", usage.ru_nivcsw);

#endif

end:
return;
}
+
+

完整代码:https://github.com/AnSwErYWJ/DogFood/blob/master/C/getrusage.c

+
+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2021/06/23/getrusage/ +

发表日期:2021/06/23 15:06

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 简介
  2. 2. 函数说明
    1. 2.1. 原型
    2. 2.2. 参数
    3. 2.3. 返回值
    4. 2.4. 属性
  3. 3. 示例
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2021/07/28/tips-of-inline/index.html b/2021/07/28/tips-of-inline/index.html new file mode 100644 index 000000000..d6722c470 --- /dev/null +++ b/2021/07/28/tips-of-inline/index.html @@ -0,0 +1,2043 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + inline使用注意事项 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + inline使用注意事项 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + + + +
+ + + + +
+ 字数统计: 494阅读时长: 11 min +
+ +
+ + + 2021/07/28 + + + + +
+
+ +
+
+ + + + +
+
+
+

GCC在不优化时不会内联任何函数,除非指定函数的“always_inline”属性。

+ + +

先附上结论:**GCC在不优化时不会内联任何函数,除非指定函数的“always_inline”属性。**

+

测试代码:

+
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

inline void say(void) {
printf("Hello, World\n");
}

int main(void) {
say();
return 0;
}
+ +

使用-O3优化选项,一切正常:

+
1
2
3
4
$ gcc -O3 -o test_O3.o -c test.c
$ g++ test_O3.o -o test_O3
$ ./test_O3
Hello, World
+ +

使用-O0优化选项,链接时报错,提示找不到内联函数say

+
1
2
3
4
5
$ gcc -O0 -o test_O0.o -c test.c
$ g++ test_O0.o -o test_O0
test_O0.o: In function `main':
test.c:(.text+0x5): undefined reference to `say'
collect2: error: ld returned 1 exit status
+ +

分别查看文件test_O0.otest_O3.o

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ readelf -s test_O0.o

Symbol table '.symtab' contains 10 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS test.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 3
4: 0000000000000000 0 SECTION LOCAL DEFAULT 4
5: 0000000000000000 0 SECTION LOCAL DEFAULT 6
6: 0000000000000000 0 SECTION LOCAL DEFAULT 7
7: 0000000000000000 0 SECTION LOCAL DEFAULT 5
8: 0000000000000000 16 FUNC GLOBAL DEFAULT 1 main
9: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND say
+ +
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ readelf -s test_O3.o

Symbol table '.symtab' contains 13 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS test.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 2
4: 0000000000000000 0 SECTION LOCAL DEFAULT 3
5: 0000000000000000 0 SECTION LOCAL DEFAULT 4
6: 0000000000000000 0 SECTION LOCAL DEFAULT 5
7: 0000000000000000 0 SECTION LOCAL DEFAULT 6
8: 0000000000000000 0 SECTION LOCAL DEFAULT 9
9: 0000000000000000 0 SECTION LOCAL DEFAULT 10
10: 0000000000000000 0 SECTION LOCAL DEFAULT 8
11: 0000000000000000 21 FUNC GLOBAL DEFAULT 6 main
12: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND puts
+

可以发现文件test_O0.o中,inline修饰的函数say为未定义状态,说明inline函数并没有展开。

+

指定say函数为“always_inline”属性:

+
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

__attribute__((always_inline)) inline void say(void) {
printf("Hello, World\n");
}

int main(void) {
say();
return 0;
}
+ +

重新使用-O0优化选项编译运行,一切ok

+
1
2
3
4
5
$ gcc -O0 -o test.o -c test.c
$ gcc -O0 -o test_O0_2.o -c test.c
$ g++ test_O0_2.o -o test_O0_2
$ ./test_O0_2
Hello, World
+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2021/07/28/tips-of-inline/ +

发表日期:2021/07/28 14:07

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2022/01/06/wav/canonical_wave_file_format.png b/2022/01/06/wav/canonical_wave_file_format.png new file mode 100644 index 000000000..0b3066dc5 Binary files /dev/null and b/2022/01/06/wav/canonical_wave_file_format.png differ diff --git a/2022/01/06/wav/index.html b/2022/01/06/wav/index.html new file mode 100644 index 000000000..36fe6118b --- /dev/null +++ b/2022/01/06/wav/index.html @@ -0,0 +1,2389 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + wav文件格式解析 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + wav文件格式解析 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + + + +
+ + + + +
+ 字数统计: 2k阅读时长: 41 min +
+ +
+ + + 2022/01/06 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文将详细分析不同格式的wav文件。

+ + +

简介

wavwave(下文统称为wav), 该文件格式是由微软开发的用于音频数字存储的标准,可应用于WindowsLinuxMacOS等多种操作系统,文件扩展名为.wav,是waveform的简写。

+

wav文件结构

Windows下,大部分多媒体文件都遵循RIFFResource Interchange File Format,资源互换文件格式)格式来存储数据。

+

RIFF文件的基本存储单位称为块(chunk),一个遵循RIFF格式的文件由若干个chunk组成,每个chunk又由块标识、块长度和块数据三部分构成,其基本结构见表1

+ + + + + + + + + + + + + + + + + + + + + + + +
FieldSize(bytes)Type
块标识4S8 *
块长度4U32
块数据S8 *
+

**表1** `chunk`基本结构

+ +
    +
  • 块标识:用于标识块中的数据,由4ASCII字符组成,如不满4个字符则在右边以空格充填,如:RIFFLISTfmt data等;
  • +
  • 块长度:用于标识块数据域中的数据长度,块标识域和块长度域不包括在其中,所以一个chunk的实际长度为该值加8;
  • +
  • 块数据:存储块数据,若数据长度为奇数,则在最后添加一个NULL
  • +
+

特别需要注意的是,RIFF格式规定只有块标识为RIFFLIST的块可以含有子块(subChunk),而其它块只可以包含数据。块标识为RIFFLIST的块的结构与表1大致相同,只不过其块数据域分为两部分:

+
    +
  • type:由4ASCII字符组成,代表RIFF文件的类型,如WAVEAVI ,或者代表LIST块的类型,如avi文件中的列表hdrlmovi
  • +
  • data:实际的块内容,包含若干subChunk
  • +
+

wav文件是非常简单的一种RIFF文件,其本身就是由一个块标识为RIFFchunk和多个subChunk组成的一个chunk,其组成如下:

+
    +
  • RIFF chunk:主块,必选,块标识为RIFF,说明这是一个RIFF文件,RIFF文件的第一个块标识必须是RIFF
  • +
  • Format chunk:子块,必选,块标识为fmt ,用于存储文件的一些参数信息,比如采样率、通道数和编码格式等;
  • +
  • Fact chunk:子块,可选,块标识为fact,基于压缩编码的wav文件必须含有fact块;
  • +
  • List chunk:子块,可选,块标识为LIST,用于记录文件版权和创建时间信息;
  • +
  • Data chunk:子块,必选,块标识为data,用于存储音频数据;
  • +
+

目前业界标准的wav文件仅由RIFF chunkFormat chunkData chunk组成:
标准wav文件格式

+

wav文件头格式

wav文件从数据类型上看,主要由文件头和数据体两部分组成:

+
    +
  • 文件头:由RIFF chunkFormat chunkList chunkFact chunk等组成,用于存储一些文件信息;
  • +
  • 数据体:由Data chunk组成,用于存储音频数据;
  • +
+

标准格式

标准的wav文件头仅由RIFF chunkFormat chunk组成,长度为44个字节,格式见表2

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
file offset(bytes)Field nameField size(bytes)typeendiandescription
0Chunk ID4S8 *big“RIFF”,表明为RIFF文件
4Chunk Size4U32little除了RIFF及自己之外,整个文件的长度,即文件总字节数减去8字节
8Format4S8 *big“WAVE”,表明为wav格式
12Subchunk1 ID4S8 *big“fmt “
16Subchunk1 Size4U32little表示fmt数据块即subchunk1除了Subchunk1 ID和Subchunk1 Size之后剩下的长度,一般为16, 大于16表示存在扩展区域,可选值为16、18、20、40等
20AudioFormat2U16little编码格式,即压缩格式,0x01表示pcm格式,无压缩,参见表3
22NumChannels2U16little音频通道数,单声道为1,立体声或双声道为2
24SampleRate4U32little采样频率,每个通道单位时间采样次数,可选值为16000kHz和44100kHz等
28ByteRate4U32little数据传输速率,可用此估算缓冲区长度,ByteRate = SampleRate * NumChannels * (BitsPerSample / 8)
32BlockAlign2U16little采样一次的字节数,即一帧的字节数,表示块对齐的内容(数据块的调整数),播放软件一次处理多少个该长度的字节数据,以便将其用于缓冲区的调整,BlockAlign = NumChannels * (BitsPerSample / 8)
34BitsPerSample2U16little采样位宽,即每个采样点的bit数,可选值8、16或32等
36Subchunk2 ID4S8 *big“data”
40Subchunk2 Size4U32little音频数据的总长度,即文件总字节数减去wav文件头的长度
44Datalittle音频数据
+

**表2** 标准的`wav`文件头格式

+ +

通过wav文件头信息,我们可以计算出音频时长:

+
1
音频时长(s) = Subchunk2 Size / ByteRate
+ +

压缩编码格式

wav文件几乎支持所有ACM规范的编码格式,其信息存储在wav文件头偏移2021两个字节中,常见的压缩编码格式见表3

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
格式代码格式名称Format chunk 长度是否有Fact chunk
0 (0x0000)unknownunknownunknown
1 (0x0001)PCM/uncompressed16
2 (0x0002)Microsoft ADPCM18
3(0x0003)IEEE float18
6 (0x0006)ITU G.711 a-law18
7 (0x0007)ITU G.711 µ-law18
17 (0x0011)IMA ADPCMunknownunknown
20 (0x0016)ITU G.723 ADPCM (Yamaha)unknownunknown
49 (0x0031)GSM 6.1020
64 (0x0040)ITU G.721 ADPCMunknown
80 (0x0050)MPEGunknownunknown
65,534 (0xFFFE)扩展格式标识40unknown
65,536 (0xFFFF)Experimentalunknownunknown
+

**表3** 常见的压缩编码格式

+ +

扩展格式

当然,也不是所有的wav文件头都是44个字节的,比如通过FFmpge编码而来的wav文件头通常大于44个字节,目前比较常见的wav文件头长度有44字节、46字节、58字节和98字节。

+

Format chunk扩展

wav文件采用非PCM编码即压缩格式时,会扩展Format chunk,在其之后扩充了一个数据结构,见表4

+ + + + + + + + + + + + + + + + + + + + + + + + +
file offset(bytes)Field nameField size(bytes)typedescription
24extand size2U16除其自身外的扩展区域长度
26extand area包含扩展的格式信息,其长度取决于压缩编码类型。当某种编码格式(如ITU G.711 a-law)使扩展区的长度为0时,该字段还必须保留,只是长度字段的数值为0。
+

**表4** 标准Format chunk扩展格式

+ +
+

由此可以得出,如果Subchunk1 Size等于0x10(16),表示不包含Format chunk扩展,wav文件头长度为44字节;如果大于0x10(16),则包含Format chunk扩展,扩展长度的最小值为18(16+2),此时wav文件头大于44字节。

+
+

当编码格式代码为0xFFFE时,Format chunk扩展长度为24字节,格式见表5

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
file offset(bytes)Field nameField size(bytes)typedescription
24扩展区长度2U16值为22
26有效采样位数2U16最大值为 每个采样字节数 * 8
28扬声器位置4U32声道号与扬声器位置映射的二进制掩码
32编码格式2U16真正的编码格式代码
3414值为{\x00, \x00, \x00, \x00, \x10, \x00, \x80, \x00, \x00, \xAA, \x00, \x38, \x9B, \x71}
+

**表5** 编码为0xFFFE的Format chunk扩展格式

+ +

Fact chunk

采用压缩编码(修订版Rev.3以后出现的编码格式)的wav文件必定有含有Fact chunk,其结构符合标准chunk结构,参见表1

+

Fact chunk的块标识符为”fact“,块长度至少为4个字节,目前其只有一个块数据内容,即每个声道采样总数,或采样帧总数。该值等于Subchunk2 Size / BlockAlign

+

值得注意的是,在实测中发现,将压缩编码格式文件转换成PCM编码格式后,原Fact chunk仍然存在。

+

wav文件动态解析库

wav文件格式是一种极其简单的文件格式,如果对其结构足够熟悉,完全可以通过代码正确读写,从而免去引入一些复杂的中间库,降低复杂度,提高工作效率。

+

这里提供了一个wav文件动态解析库,欢迎使用。

+

Reference

+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2022/01/06/wav/ +

发表日期:2022/01/06 10:01

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 简介
  2. 2. wav文件结构
  3. 3. wav文件头格式
    1. 3.1. 标准格式
      1. 3.1.1. 压缩编码格式
    2. 3.2. 扩展格式
      1. 3.2.1. Format chunk扩展
      2. 3.2.2. Fact chunk
  4. 4. wav文件动态解析库
  5. 5. Reference
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2022/12/20/generate-and-usage-of-core-in-linux/index.html b/2022/12/20/generate-and-usage-of-core-in-linux/index.html new file mode 100644 index 000000000..de6e2ffe9 --- /dev/null +++ b/2022/12/20/generate-and-usage-of-core-in-linux/index.html @@ -0,0 +1,2063 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Linux下core文件的生成和使用 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + + + + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + Linux下core文件的生成和使用 + + +

+ +

+ + + + + +

+ + +
+ + +
+ + + + + + + + + + + + + + + +
+ + + + +
+ 字数统计: 905阅读时长: 19 min +
+ +
+ + + 2022/12/20 + + + + +
+
+ +
+
+ + + + +
+
+
+

本文对作者2018年的博文Linux下core文件使用做了一系列更新,特别是针对Ubuntu 20.04core文件生成异常做了分析与解决。

+ + +

什么是core文件

Linux下遇到程序异常退出或者中止,操作系统通常会把程序当前的工作状况存储在一个名为core的文件中,其中包含了程序运行时的内存、寄存器和堆栈指针等信息,格式为ELF,这个过程叫做coredump,又称作核心转储。

+

通过工具分析这个文件,我们可以定位到程序异常退出或者终止时相应的堆栈调用等信息。

+

如何生成core文件

查看coredump是否生效

1
2
3
4
$ ulimit -a
...
-c: core file size (blocks) 0
...
+

0 表示core文件大小限制为0,不允许写入,所以无法生成core文件,需要修改为正数大小或unlimited才可使coredump生效。

+

修改core文件大小的限制

取消core文件大小限制:

+
1
2
3
4
5
ulimit -c unlimited
ulimit -a
...
-c: core file size (blocks) unlimited
...
+ +

也可以对core文件的大小进行有效限制,单位为blocks,一般1 block=512 bytes,设置太小可能导致不会生成文件:

+
1
2
3
4
5
$ ulimit -c 1024
$ ulimit -a
...
-c: core file size (blocks) 1024
...
+ +
+

上面对core文件的操作仅对当前生效,若需要永久生效,则要将相应操作写入/etc/profile

+
+

设置core文件存储路径

core文件默认存储在程序的工作目录,可以通过命令cat /proc/sys/kernel/core_pattern 查看。

+

在文件/etc/sysctl.conf末尾加入如下信息,可以指定core文件的存储路径:

+
1
kernel.core_pattern=/dumpdir/core_%e_%p_%t
+ +

控制core文件的文件名中是否添加pid作为扩展:

+
1
echo "1" > /proc/sys/kernel/core_uses_pid  
+
+

/proc/sys/kernel/core_uses_pid这个文件的值若为1,则无论是否配置%p,最后生成的core文件都会添加pid

+
+

通常情况下,重启即可生效。

+

core文件命名使用的参数列表:

+
1
2
3
4
5
6
7
%p - insert pid into filename  # 添加 pid 
%u - insert current uid into filename # 添加当前 uid
%g - insert current gid into filename # 添加当前 gid
%s - insert signal that caused the coredump into the filename # 添加导致产生 core 的信号
%t - insert UNIX time that the coredump occurred into filename # 添加 core 文件生成时的 unix 时间
%h - insert hostname where the coredump happened into filename # 添加主机名
%e - insert coredumping executable name into filename # 添加命令名
+

关闭apport.service服务

Ubuntu 20.04中,执行完上述操作,会发现还是无法在指定目录生成core文件。

+

查看core文件存储路径:

+
1
2
$ cat /proc/sys/kernel/core_pattern
|/usr/share/apport/apport %p %s %c %d %P %E
+

发现core文件存储路径并非自己设置的,而是由管道交给了一个apport的程序,通过查询可知其是Ubuntu官方为了自动收集错误,生成程序崩溃报告的一个服务,即apport.service

+

我们可以关闭apport.service这个服务:

+
1
sudo service apport stop
+
+

使用sudo service apport start可以开启这个服务。

+
+

如果这个命令无效的话,可以修改/etc/default/apport文件,将enabled改成0

+

如上,可以在指定路径生成core文件。

+

使用core文件调试

可以使用gdbcore文件进行调试:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
$ gdb a.out
...
(gdb) core-file core
...
(gdb) bt
...

or

$ gdb a.out core
...
(gdb) bt
...
+
+

编译可执行程序时需要带上-g选项。

+
+

如需要在PC上调试嵌入式设备产生的core文件,则需要选取相应平台的gdb工具,并在进入gdb后设置符号文件的位置:

+
1
2
3
4
5
6
7
8
$ xxx-xxx-gdb a.out
...
(gdb) solib-search-path xxx.so:xxx.so
...
(gdb) core-file core
...
(gdb) bt
...
+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/2022/12/20/generate-and-usage-of-core-in-linux/ +

发表日期:2022/12/20 17:12

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + +
+ + +
+ + +
+
+ CATALOG +
+
  1. 1. 什么是core文件
  2. 2. 如何生成core文件
    1. 2.1. 查看coredump是否生效
    2. 2.2. 修改core文件大小的限制
    3. 2.3. 设置core文件存储路径
    4. 2.4. 关闭apport.service服务
  3. 3. 使用core文件调试
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/404.html b/404.html new file mode 100644 index 000000000..74b80c30b --- /dev/null +++ b/404.html @@ -0,0 +1,1870 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + 公益404 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + 公益404 + + +

+ +

+ + + + +

+ + +
+
+ + + + +
+ + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CNAME b/CNAME new file mode 100644 index 000000000..b56b08c35 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +answerywj.com diff --git a/about/index.html b/about/index.html new file mode 100644 index 000000000..7f4d0ac52 --- /dev/null +++ b/about/index.html @@ -0,0 +1,1897 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + 关于博主 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + + + +
+
+
+ +

+ + + 关于博主 + +

+ +

+ + +

+ + +
+
+ + + + +
+ +
+
+

Hi there 👋

+WeiJie Yuan's Github Stats + + + +

目前在做的

    +
  • 音频算法工程化, 移植和优化
  • +
  • 神经网络模型推理计算框架开发和优化, 包含算子融合, 计算优化及量化
  • +
  • 异构计算开发及算力优化, 包含 Cortex-A(Neon/ACL), Qualcomm aDSP/cDSP(QHL/HVX/HTA), Tensilica HIFI3/4/5
  • +
+

感兴趣想做的

    +
  • Android Audio, 包括Audio HAL/ALSA/AudioFlinger
  • +
  • 待补充
  • +
+

有工作机会欢迎联系~

+ +
+
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2016/07/index.html b/archives/2016/07/index.html new file mode 100644 index 000000000..8ae9f2074 --- /dev/null +++ b/archives/2016/07/index.html @@ -0,0 +1,2304 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + + UNIX编程安全读写函数 + +
+

字节流套接字(TCP套接字)上的read和write函数所表现的行为不同于通常的文件I/O。字节流套接字调用read或write输入或输出的字节数可能比请求的数量少,然而这并不是出错的状态。这是因为内核中用于套接字的缓冲区可能达到了极限。通常这种情况出现在一次读多于4096个字节或write在非阻塞情况下返回不足字节数。为了不多次调用read或防止write返回不足字节数,我们用下面的两个函数来替代read和write。

+
+ + + +
+
+ + + + + + + + +
+ + + C语言生成随机数 + +
+

本文将介绍C语言生成随机数的方法,主要使用 rand() 函数和 srand() 函数.

+
+ + + +
+
+ + + + + + + + +
+ + + Linux Shell 脚本调试总结 + +
+

Shell脚本是用户与Linux操作系统交互的一种方式,在脚本编程过程中自然少不了进行调试工作,本文将介绍三种常用的调试方法.(默认使用bash shell)

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + + Linux fork炸弹解析 + +
+

**:(){ :|: & };:**是一个bash函数,以Fork Bomb闻名,是一个拒绝服务攻击 的Linux 系统。如果你好奇地去执行了这个命令,那么赶快重启系统吧~!

+
+ + + +
+
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2016/08/index.html b/archives/2016/08/index.html new file mode 100644 index 000000000..72e86e7a3 --- /dev/null +++ b/archives/2016/08/index.html @@ -0,0 +1,1964 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + Hexo+Github博客备份方法 + +
+

使用hexo+github搭建的博客,博客作为一个单独的github仓库存在,可是仓库中不包含你每篇博客的源文件。如果你换了一台机器想要更新博客或者想重新发布以前的博客,这就不好办了。我这里推荐一种云端备份的方法。

+
+ + + +
+
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2016/09/index.html b/archives/2016/09/index.html new file mode 100644 index 000000000..bbf578ada --- /dev/null +++ b/archives/2016/09/index.html @@ -0,0 +1,2008 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + 科普|3.5mm耳机国标和美标 + +
+

现在3.5mm规格的耳机已经普遍使用,但是用户会发现一些国外厂家的耳机并不适用国产手机,下面就为大家科普一下,解开这个迷题。

+
+ + + +
+
+ + + + + + + + +
+ + + Shell脚本浮点运算 + +
+

本文将介绍几种Linux下通过Shell脚本进行浮点数计算的方法。

+
+ + + +
+
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2016/10/index.html b/archives/2016/10/index.html new file mode 100644 index 000000000..d0019b56e --- /dev/null +++ b/archives/2016/10/index.html @@ -0,0 +1,1960 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + Linux下处理json数据 + +
+

当我们在Linux下需要处理json数据时,第一反应是用脚本编写一个工具,这样即耗时又不通用. 本文将介绍专门的命令行json处理工具jq.

+
+ + + +
+
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2016/12/index.html b/archives/2016/12/index.html new file mode 100644 index 000000000..3d11bc468 --- /dev/null +++ b/archives/2016/12/index.html @@ -0,0 +1,1960 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + + + + + + +
+ + + 从文件流中读写整数--C语言 + +
+

本文将介绍在文本流中,读写整数的两个接口– int getw(FILE *fp)int putw(int w, FILE *fp),并且与你分享改进后的更实用的接口– unsigned int get_uint(FILE *fp)unsigned int put_uint(unsigned int i,FILE *fp).

+
+ + + +
+
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2016/index.html b/archives/2016/index.html new file mode 100644 index 000000000..f0e8f13df --- /dev/null +++ b/archives/2016/index.html @@ -0,0 +1,2354 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + + + + + + +
+ + + 从文件流中读写整数--C语言 + +
+

本文将介绍在文本流中,读写整数的两个接口– int getw(FILE *fp)int putw(int w, FILE *fp),并且与你分享改进后的更实用的接口– unsigned int get_uint(FILE *fp)unsigned int put_uint(unsigned int i,FILE *fp).

+
+ + + +
+
+ + + + + + + + +
+ + + Linux下处理json数据 + +
+

当我们在Linux下需要处理json数据时,第一反应是用脚本编写一个工具,这样即耗时又不通用. 本文将介绍专门的命令行json处理工具jq.

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + +
+ + + 科普|3.5mm耳机国标和美标 + +
+

现在3.5mm规格的耳机已经普遍使用,但是用户会发现一些国外厂家的耳机并不适用国产手机,下面就为大家科普一下,解开这个迷题。

+
+ + + +
+
+ + + + + + + + +
+ + + Shell脚本浮点运算 + +
+

本文将介绍几种Linux下通过Shell脚本进行浮点数计算的方法。

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + +
+ + + Hexo+Github博客备份方法 + +
+

使用hexo+github搭建的博客,博客作为一个单独的github仓库存在,可是仓库中不包含你每篇博客的源文件。如果你换了一台机器想要更新博客或者想重新发布以前的博客,这就不好办了。我这里推荐一种云端备份的方法。

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2016/page/2/index.html b/archives/2016/page/2/index.html new file mode 100644 index 000000000..4f2c12b72 --- /dev/null +++ b/archives/2016/page/2/index.html @@ -0,0 +1,2258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + + UNIX编程安全读写函数 + +
+

字节流套接字(TCP套接字)上的read和write函数所表现的行为不同于通常的文件I/O。字节流套接字调用read或write输入或输出的字节数可能比请求的数量少,然而这并不是出错的状态。这是因为内核中用于套接字的缓冲区可能达到了极限。通常这种情况出现在一次读多于4096个字节或write在非阻塞情况下返回不足字节数。为了不多次调用read或防止write返回不足字节数,我们用下面的两个函数来替代read和write。

+
+ + + +
+
+ + + + + + + + +
+ + + C语言生成随机数 + +
+

本文将介绍C语言生成随机数的方法,主要使用 rand() 函数和 srand() 函数.

+
+ + + +
+
+ + + + + + + + +
+ + + Linux Shell 脚本调试总结 + +
+

Shell脚本是用户与Linux操作系统交互的一种方式,在脚本编程过程中自然少不了进行调试工作,本文将介绍三种常用的调试方法.(默认使用bash shell)

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + + Linux fork炸弹解析 + +
+

**:(){ :|: & };:**是一个bash函数,以Fork Bomb闻名,是一个拒绝服务攻击 的Linux 系统。如果你好奇地去执行了这个命令,那么赶快重启系统吧~!

+
+ + + +
+
+ + + + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2017/02/index.html b/archives/2017/02/index.html new file mode 100644 index 000000000..34fefef30 --- /dev/null +++ b/archives/2017/02/index.html @@ -0,0 +1,1914 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2017/03/index.html b/archives/2017/03/index.html new file mode 100644 index 000000000..ba7eaa8ca --- /dev/null +++ b/archives/2017/03/index.html @@ -0,0 +1,1912 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2017/06/index.html b/archives/2017/06/index.html new file mode 100644 index 000000000..28f16acb2 --- /dev/null +++ b/archives/2017/06/index.html @@ -0,0 +1,2008 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + UNIX下IO模型分析 + +
+

UNIX下的五种常见IO模型分析,帮助理解

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2017/08/index.html b/archives/2017/08/index.html new file mode 100644 index 000000000..c93097000 --- /dev/null +++ b/archives/2017/08/index.html @@ -0,0 +1,1912 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + GCC编译ARM篇 + +
+

ARM 平台下GCC编译相关介绍,待补充

+
+ + + +
+
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2017/12/index.html b/archives/2017/12/index.html new file mode 100644 index 000000000..7f5550985 --- /dev/null +++ b/archives/2017/12/index.html @@ -0,0 +1,1960 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + Speex介绍 + +
+

本文将对Speex相关的概念进行介绍

+
+ + + +
+
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2017/index.html b/archives/2017/index.html new file mode 100644 index 000000000..8b1645315 --- /dev/null +++ b/archives/2017/index.html @@ -0,0 +1,2250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + Speex介绍 + +
+

本文将对Speex相关的概念进行介绍

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + +
+ + + GCC编译ARM篇 + +
+

ARM 平台下GCC编译相关介绍,待补充

+
+ + + +
+
+ + + + + + + + +
+ + + UNIX下IO模型分析 + +
+

UNIX下的五种常见IO模型分析,帮助理解

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2018/03/index.html b/archives/2018/03/index.html new file mode 100644 index 000000000..b45e1b7f9 --- /dev/null +++ b/archives/2018/03/index.html @@ -0,0 +1,1912 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + Linux下core文件使用 + +
+

有时候程序会异常退出而不带任何日志,此时就可以使用core文件进行分析,它会记录程序运行的内存,寄存器,堆栈指针等信息

+
+ + + +
+
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2018/05/index.html b/archives/2018/05/index.html new file mode 100644 index 000000000..ddc0f1ef4 --- /dev/null +++ b/archives/2018/05/index.html @@ -0,0 +1,1912 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + cJSON的秘密 + +
+

学习使用cJSON过程的一些发现和总结,不涉及具体的函数

+
+ + + +
+
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2018/09/index.html b/archives/2018/09/index.html new file mode 100644 index 000000000..67a631c42 --- /dev/null +++ b/archives/2018/09/index.html @@ -0,0 +1,1912 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + C代码覆盖率测试工具Gcov + +
+

代码覆盖率测试反映了测试的广度与深度,量化了测试和开发质量,是十分有必要的,业界目前有针对各种语言的覆盖率测试工具,本文主要介绍C/C++相关的覆盖率测试工具Gcov

+
+ + + +
+
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2018/index.html b/archives/2018/index.html new file mode 100644 index 000000000..90cb7f772 --- /dev/null +++ b/archives/2018/index.html @@ -0,0 +1,2008 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + C代码覆盖率测试工具Gcov + +
+

代码覆盖率测试反映了测试的广度与深度,量化了测试和开发质量,是十分有必要的,业界目前有针对各种语言的覆盖率测试工具,本文主要介绍C/C++相关的覆盖率测试工具Gcov

+
+ + + +
+
+ + + + + + + + +
+ + + cJSON的秘密 + +
+

学习使用cJSON过程的一些发现和总结,不涉及具体的函数

+
+ + + +
+
+ + + + + + + + +
+ + + Linux下core文件使用 + +
+

有时候程序会异常退出而不带任何日志,此时就可以使用core文件进行分析,它会记录程序运行的内存,寄存器,堆栈指针等信息

+
+ + + +
+
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2019/02/index.html b/archives/2019/02/index.html new file mode 100644 index 000000000..a1b7873ed --- /dev/null +++ b/archives/2019/02/index.html @@ -0,0 +1,1912 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2019/04/index.html b/archives/2019/04/index.html new file mode 100644 index 000000000..2b8223754 --- /dev/null +++ b/archives/2019/04/index.html @@ -0,0 +1,1964 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + sysroot为何物? + +
+

本文介绍链接过程中sysroot的作用。

+
+ + + +
+
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2019/05/index.html b/archives/2019/05/index.html new file mode 100644 index 000000000..0a94e6d42 --- /dev/null +++ b/archives/2019/05/index.html @@ -0,0 +1,1914 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + 深究strtok系列函数 + +
+

本文通过分析源码,深究GLIBCstrtokstrtok_r函数的实现原理和使用过程中的注意事项。

+
+ + + +
+
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2019/07/index.html b/archives/2019/07/index.html new file mode 100644 index 000000000..95d71bf9e --- /dev/null +++ b/archives/2019/07/index.html @@ -0,0 +1,1914 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2019/09/index.html b/archives/2019/09/index.html new file mode 100644 index 000000000..e9d1dfde7 --- /dev/null +++ b/archives/2019/09/index.html @@ -0,0 +1,1912 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2019/index.html b/archives/2019/index.html new file mode 100644 index 000000000..2c8ca3f49 --- /dev/null +++ b/archives/2019/index.html @@ -0,0 +1,2160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + + 深究strtok系列函数 + +
+

本文通过分析源码,深究GLIBCstrtokstrtok_r函数的实现原理和使用过程中的注意事项。

+
+ + + +
+
+ + + + + + + + +
+ + + sysroot为何物? + +
+

本文介绍链接过程中sysroot的作用。

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2020/02/index.html b/archives/2020/02/index.html new file mode 100644 index 000000000..2e702f0f4 --- /dev/null +++ b/archives/2020/02/index.html @@ -0,0 +1,1914 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + Homebrew + +
+

本文将介绍Homebrew的安装与使用。

+
+ + + +
+
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2020/05/index.html b/archives/2020/05/index.html new file mode 100644 index 000000000..515dae49f --- /dev/null +++ b/archives/2020/05/index.html @@ -0,0 +1,1916 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2020/07/index.html b/archives/2020/07/index.html new file mode 100644 index 000000000..5cc99e551 --- /dev/null +++ b/archives/2020/07/index.html @@ -0,0 +1,1916 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2020/09/index.html b/archives/2020/09/index.html new file mode 100644 index 000000000..71243939f --- /dev/null +++ b/archives/2020/09/index.html @@ -0,0 +1,1912 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2020/index.html b/archives/2020/index.html new file mode 100644 index 000000000..aee11f97b --- /dev/null +++ b/archives/2020/index.html @@ -0,0 +1,2066 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + + Homebrew + +
+

本文将介绍Homebrew的安装与使用。

+
+ + + +
+
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2021/02/index.html b/archives/2021/02/index.html new file mode 100644 index 000000000..61758a11d --- /dev/null +++ b/archives/2021/02/index.html @@ -0,0 +1,1916 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + RPATH与RUNPATH的区别 + +
+

本文从一个实际遇到的问题出发,分析 RPATHRUNPATH 的区别,以及产生的原因。

+
+ + + +
+
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2021/06/index.html b/archives/2021/06/index.html new file mode 100644 index 000000000..bf2f12b3f --- /dev/null +++ b/archives/2021/06/index.html @@ -0,0 +1,1912 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + getrusage-进程资源统计函数 + +
+

getrusage用于统计系统资源使用情况,即进程执行直到调用该函数时的资源使用情况,如果在不同的时间调用该函数,会得到不同的结果。

+
+ + + +
+
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2021/07/index.html b/archives/2021/07/index.html new file mode 100644 index 000000000..35c295c54 --- /dev/null +++ b/archives/2021/07/index.html @@ -0,0 +1,1914 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + inline使用注意事项 + +
+

GCC在不优化时不会内联任何函数,除非指定函数的“always_inline”属性。

+
+ + + +
+
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2021/index.html b/archives/2021/index.html new file mode 100644 index 000000000..6d39e1a9d --- /dev/null +++ b/archives/2021/index.html @@ -0,0 +1,2014 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + inline使用注意事项 + +
+

GCC在不优化时不会内联任何函数,除非指定函数的“always_inline”属性。

+
+ + + +
+
+ + + + + + + + +
+ + + getrusage-进程资源统计函数 + +
+

getrusage用于统计系统资源使用情况,即进程执行直到调用该函数时的资源使用情况,如果在不同的时间调用该函数,会得到不同的结果。

+
+ + + +
+
+ + + + + + + + +
+ + + RPATH与RUNPATH的区别 + +
+

本文从一个实际遇到的问题出发,分析 RPATHRUNPATH 的区别,以及产生的原因。

+
+ + + +
+
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2022/01/index.html b/archives/2022/01/index.html new file mode 100644 index 000000000..645a56056 --- /dev/null +++ b/archives/2022/01/index.html @@ -0,0 +1,1914 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2022/12/index.html b/archives/2022/12/index.html new file mode 100644 index 000000000..0bf8b83b6 --- /dev/null +++ b/archives/2022/12/index.html @@ -0,0 +1,1916 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/2022/index.html b/archives/2022/index.html new file mode 100644 index 000000000..8e9c8d941 --- /dev/null +++ b/archives/2022/index.html @@ -0,0 +1,1966 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/index.html b/archives/index.html new file mode 100644 index 000000000..b0f5f9794 --- /dev/null +++ b/archives/index.html @@ -0,0 +1,2370 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + + inline使用注意事项 + +
+

GCC在不优化时不会内联任何函数,除非指定函数的“always_inline”属性。

+
+ + + +
+
+ + + + + + + + +
+ + + getrusage-进程资源统计函数 + +
+

getrusage用于统计系统资源使用情况,即进程执行直到调用该函数时的资源使用情况,如果在不同的时间调用该函数,会得到不同的结果。

+
+ + + +
+
+ + + + + + + + +
+ + + RPATH与RUNPATH的区别 + +
+

本文从一个实际遇到的问题出发,分析 RPATHRUNPATH 的区别,以及产生的原因。

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + + Homebrew + +
+

本文将介绍Homebrew的安装与使用。

+
+ + + +
+
+ + + + + + + + + +
+ + + + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/page/2/index.html b/archives/page/2/index.html new file mode 100644 index 000000000..948bc97b8 --- /dev/null +++ b/archives/page/2/index.html @@ -0,0 +1,2356 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + + + + + + +
+ + + 深究strtok系列函数 + +
+

本文通过分析源码,深究GLIBCstrtokstrtok_r函数的实现原理和使用过程中的注意事项。

+
+ + + +
+
+ + + + + + + + +
+ + + sysroot为何物? + +
+

本文介绍链接过程中sysroot的作用。

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + + C代码覆盖率测试工具Gcov + +
+

代码覆盖率测试反映了测试的广度与深度,量化了测试和开发质量,是十分有必要的,业界目前有针对各种语言的覆盖率测试工具,本文主要介绍C/C++相关的覆盖率测试工具Gcov

+
+ + + +
+
+ + + + + + + + +
+ + + cJSON的秘密 + +
+

学习使用cJSON过程的一些发现和总结,不涉及具体的函数

+
+ + + +
+
+ + + + + + + + +
+ + + Linux下core文件使用 + +
+

有时候程序会异常退出而不带任何日志,此时就可以使用core文件进行分析,它会记录程序运行的内存,寄存器,堆栈指针等信息

+
+ + + +
+
+ + + + + + + + +
+ + + Speex介绍 + +
+

本文将对Speex相关的概念进行介绍

+
+ + + +
+
+ + + + + + + + + +
+ + + + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/page/3/index.html b/archives/page/3/index.html new file mode 100644 index 000000000..aef0f1ff9 --- /dev/null +++ b/archives/page/3/index.html @@ -0,0 +1,2350 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + GCC编译ARM篇 + +
+

ARM 平台下GCC编译相关介绍,待补充

+
+ + + +
+
+ + + + + + + + +
+ + + UNIX下IO模型分析 + +
+

UNIX下的五种常见IO模型分析,帮助理解

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + + 从文件流中读写整数--C语言 + +
+

本文将介绍在文本流中,读写整数的两个接口– int getw(FILE *fp)int putw(int w, FILE *fp),并且与你分享改进后的更实用的接口– unsigned int get_uint(FILE *fp)unsigned int put_uint(unsigned int i,FILE *fp).

+
+ + + +
+
+ + + + + + + + +
+ + + Linux下处理json数据 + +
+

当我们在Linux下需要处理json数据时,第一反应是用脚本编写一个工具,这样即耗时又不通用. 本文将介绍专门的命令行json处理工具jq.

+
+ + + +
+
+ + + + + + + + + +
+ + + + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/page/4/index.html b/archives/page/4/index.html new file mode 100644 index 000000000..c49b8db12 --- /dev/null +++ b/archives/page/4/index.html @@ -0,0 +1,2358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + 科普|3.5mm耳机国标和美标 + +
+

现在3.5mm规格的耳机已经普遍使用,但是用户会发现一些国外厂家的耳机并不适用国产手机,下面就为大家科普一下,解开这个迷题。

+
+ + + +
+
+ + + + + + + + +
+ + + Shell脚本浮点运算 + +
+

本文将介绍几种Linux下通过Shell脚本进行浮点数计算的方法。

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + +
+ + + Hexo+Github博客备份方法 + +
+

使用hexo+github搭建的博客,博客作为一个单独的github仓库存在,可是仓库中不包含你每篇博客的源文件。如果你换了一台机器想要更新博客或者想重新发布以前的博客,这就不好办了。我这里推荐一种云端备份的方法。

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + + UNIX编程安全读写函数 + +
+

字节流套接字(TCP套接字)上的read和write函数所表现的行为不同于通常的文件I/O。字节流套接字调用read或write输入或输出的字节数可能比请求的数量少,然而这并不是出错的状态。这是因为内核中用于套接字的缓冲区可能达到了极限。通常这种情况出现在一次读多于4096个字节或write在非阻塞情况下返回不足字节数。为了不多次调用read或防止write返回不足字节数,我们用下面的两个函数来替代read和write。

+
+ + + +
+
+ + + + + + + + +
+ + + C语言生成随机数 + +
+

本文将介绍C语言生成随机数的方法,主要使用 rand() 函数和 srand() 函数.

+
+ + + +
+
+ + + + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/archives/page/5/index.html b/archives/page/5/index.html new file mode 100644 index 000000000..ff6b5e407 --- /dev/null +++ b/archives/page/5/index.html @@ -0,0 +1,2062 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + Linux Shell 脚本调试总结 + +
+

Shell脚本是用户与Linux操作系统交互的一种方式,在脚本编程过程中自然少不了进行调试工作,本文将介绍三种常用的调试方法.(默认使用bash shell)

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + + Linux fork炸弹解析 + +
+

**:(){ :|: & };:**是一个bash函数,以Fork Bomb闻名,是一个拒绝服务攻击 的Linux 系统。如果你好奇地去执行了这个命令,那么赶快重启系统吧~!

+
+ + + +
+
+ + + + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/algolia_logo.svg b/assets/algolia_logo.svg new file mode 100644 index 000000000..64ce5dbc1 --- /dev/null +++ b/assets/algolia_logo.svg @@ -0,0 +1,21 @@ + + + + Algolia_logo_bg-white + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/beian.png b/assets/beian.png new file mode 100644 index 000000000..a34134163 Binary files /dev/null and b/assets/beian.png differ diff --git a/assets/example_qr.png b/assets/example_qr.png new file mode 100644 index 000000000..5480ae3cb Binary files /dev/null and b/assets/example_qr.png differ diff --git a/assets/favicon.ico b/assets/favicon.ico new file mode 100644 index 000000000..7f2a33a88 Binary files /dev/null and b/assets/favicon.ico differ diff --git a/assets/loading.svg b/assets/loading.svg new file mode 100644 index 000000000..b403b3347 --- /dev/null +++ b/assets/loading.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/atom.xml b/atom.xml new file mode 100644 index 000000000..61971019a --- /dev/null +++ b/atom.xml @@ -0,0 +1,469 @@ + + + AnSwErYWJ's Blog + + Sharing is a virtue + + + + 2023-03-20T06:26:35.318Z + https://answerywj.com/ + + + AnSwErYWJ + + + + Hexo + + + Linux下core文件的生成和使用 + + https://answerywj.com/2022/12/20/generate-and-usage-of-core-in-linux/ + 2022-12-20T09:17:11.000Z + 2023-03-20T06:26:35.318Z + + 本文对作者2018年的博文Linux下core文件使用做了一系列更新,特别是针对Ubuntu 20.04core文件生成异常做了分析与解决。

什么是core文件

Linux下遇到程序异常退出或者中止,操作系统通常会把程序当前的工作状况存储在一个名为core的文件中,其中包含了程序运行时的内存、寄存器和堆栈指针等信息,格式为ELF,这个过程叫做coredump,又称作核心转储。

通过工具分析这个文件,我们可以定位到程序异常退出或者终止时相应的堆栈调用等信息。

如何生成core文件

查看coredump是否生效

1
2
3
4
$ ulimit -a
...
-c: core file size (blocks) 0
...

0 表示core文件大小限制为0,不允许写入,所以无法生成core文件,需要修改为正数大小或unlimited才可使coredump生效。

修改core文件大小的限制

取消core文件大小限制:

1
2
3
4
5
ulimit -c unlimited
ulimit -a
...
-c: core file size (blocks) unlimited
...

也可以对core文件的大小进行有效限制,单位为blocks,一般1 block=512 bytes,设置太小可能导致不会生成文件:

1
2
3
4
5
$ ulimit -c 1024
$ ulimit -a
...
-c: core file size (blocks) 1024
...

上面对core文件的操作仅对当前生效,若需要永久生效,则要将相应操作写入/etc/profile

设置core文件存储路径

core文件默认存储在程序的工作目录,可以通过命令cat /proc/sys/kernel/core_pattern 查看。

在文件/etc/sysctl.conf末尾加入如下信息,可以指定core文件的存储路径:

1
kernel.core_pattern=/dumpdir/core_%e_%p_%t

控制core文件的文件名中是否添加pid作为扩展:

1
echo "1" > /proc/sys/kernel/core_uses_pid  

/proc/sys/kernel/core_uses_pid这个文件的值若为1,则无论是否配置%p,最后生成的core文件都会添加pid

通常情况下,重启即可生效。

core文件命名使用的参数列表:

1
2
3
4
5
6
7
%p - insert pid into filename  # 添加 pid 
%u - insert current uid into filename # 添加当前 uid
%g - insert current gid into filename # 添加当前 gid
%s - insert signal that caused the coredump into the filename # 添加导致产生 core 的信号
%t - insert UNIX time that the coredump occurred into filename # 添加 core 文件生成时的 unix 时间
%h - insert hostname where the coredump happened into filename # 添加主机名
%e - insert coredumping executable name into filename # 添加命令名

关闭apport.service服务

Ubuntu 20.04中,执行完上述操作,会发现还是无法在指定目录生成core文件。

查看core文件存储路径:

1
2
$ cat /proc/sys/kernel/core_pattern
|/usr/share/apport/apport %p %s %c %d %P %E

发现core文件存储路径并非自己设置的,而是由管道交给了一个apport的程序,通过查询可知其是Ubuntu官方为了自动收集错误,生成程序崩溃报告的一个服务,即apport.service

我们可以关闭apport.service这个服务:

1
sudo service apport stop

使用sudo service apport start可以开启这个服务。

如果这个命令无效的话,可以修改/etc/default/apport文件,将enabled改成0

如上,可以在指定路径生成core文件。

使用core文件调试

可以使用gdbcore文件进行调试:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ gdb a.out
...
(gdb) core-file core
...
(gdb) bt
...

or

$ gdb a.out core
...
(gdb) bt
...

编译可执行程序时需要带上-g选项。

如需要在PC上调试嵌入式设备产生的core文件,则需要选取相应平台的gdb工具,并在进入gdb后设置符号文件的位置:

1
2
3
4
5
6
7
8
$ xxx-xxx-gdb a.out
...
(gdb) solib-search-path xxx.so:xxx.so
...
(gdb) core-file core
...
(gdb) bt
...
]]>
+ + + <p>本文对作者<code>2018</code>年的博文<a href="https://answerywj.com/2018/03/07/usage-of-core-in-linux/">Linux下core文件使用</a>做了一系列更新,特别是针对<code>Ubuntu 20.04</code>下<code>core</code>文件生成异常做了分析与解决。</p> + + + + + + + + + + + + +
+ + + wav文件格式解析 + + https://answerywj.com/2022/01/06/wav/ + 2022-01-06T02:52:53.000Z + 2023-03-20T06:26:35.342Z + + 本文将详细分析不同格式的wav文件。

简介

wavwave(下文统称为wav), 该文件格式是由微软开发的用于音频数字存储的标准,可应用于WindowsLinuxMacOS等多种操作系统,文件扩展名为.wav,是waveform的简写。

wav文件结构

Windows下,大部分多媒体文件都遵循RIFFResource Interchange File Format,资源互换文件格式)格式来存储数据。

RIFF文件的基本存储单位称为块(chunk),一个遵循RIFF格式的文件由若干个chunk组成,每个chunk又由块标识、块长度和块数据三部分构成,其基本结构见表1

FieldSize(bytes)Type
块标识4S8 *
块长度4U32
块数据S8 *

**表1** `chunk`基本结构

  • 块标识:用于标识块中的数据,由4ASCII字符组成,如不满4个字符则在右边以空格充填,如:RIFFLISTfmt data等;
  • 块长度:用于标识块数据域中的数据长度,块标识域和块长度域不包括在其中,所以一个chunk的实际长度为该值加8;
  • 块数据:存储块数据,若数据长度为奇数,则在最后添加一个NULL

特别需要注意的是,RIFF格式规定只有块标识为RIFFLIST的块可以含有子块(subChunk),而其它块只可以包含数据。块标识为RIFFLIST的块的结构与表1大致相同,只不过其块数据域分为两部分:

  • type:由4ASCII字符组成,代表RIFF文件的类型,如WAVEAVI ,或者代表LIST块的类型,如avi文件中的列表hdrlmovi
  • data:实际的块内容,包含若干subChunk

wav文件是非常简单的一种RIFF文件,其本身就是由一个块标识为RIFFchunk和多个subChunk组成的一个chunk,其组成如下:

  • RIFF chunk:主块,必选,块标识为RIFF,说明这是一个RIFF文件,RIFF文件的第一个块标识必须是RIFF
  • Format chunk:子块,必选,块标识为fmt ,用于存储文件的一些参数信息,比如采样率、通道数和编码格式等;
  • Fact chunk:子块,可选,块标识为fact,基于压缩编码的wav文件必须含有fact块;
  • List chunk:子块,可选,块标识为LIST,用于记录文件版权和创建时间信息;
  • Data chunk:子块,必选,块标识为data,用于存储音频数据;

目前业界标准的wav文件仅由RIFF chunkFormat chunkData chunk组成:
标准wav文件格式

wav文件头格式

wav文件从数据类型上看,主要由文件头和数据体两部分组成:

  • 文件头:由RIFF chunkFormat chunkList chunkFact chunk等组成,用于存储一些文件信息;
  • 数据体:由Data chunk组成,用于存储音频数据;

标准格式

标准的wav文件头仅由RIFF chunkFormat chunk组成,长度为44个字节,格式见表2

file offset(bytes)Field nameField size(bytes)typeendiandescription
0Chunk ID4S8 *big“RIFF”,表明为RIFF文件
4Chunk Size4U32little除了RIFF及自己之外,整个文件的长度,即文件总字节数减去8字节
8Format4S8 *big“WAVE”,表明为wav格式
12Subchunk1 ID4S8 *big“fmt “
16Subchunk1 Size4U32little表示fmt数据块即subchunk1除了Subchunk1 ID和Subchunk1 Size之后剩下的长度,一般为16, 大于16表示存在扩展区域,可选值为16、18、20、40等
20AudioFormat2U16little编码格式,即压缩格式,0x01表示pcm格式,无压缩,参见表3
22NumChannels2U16little音频通道数,单声道为1,立体声或双声道为2
24SampleRate4U32little采样频率,每个通道单位时间采样次数,可选值为16000kHz和44100kHz等
28ByteRate4U32little数据传输速率,可用此估算缓冲区长度,ByteRate = SampleRate * NumChannels * (BitsPerSample / 8)
32BlockAlign2U16little采样一次的字节数,即一帧的字节数,表示块对齐的内容(数据块的调整数),播放软件一次处理多少个该长度的字节数据,以便将其用于缓冲区的调整,BlockAlign = NumChannels * (BitsPerSample / 8)
34BitsPerSample2U16little采样位宽,即每个采样点的bit数,可选值8、16或32等
36Subchunk2 ID4S8 *big“data”
40Subchunk2 Size4U32little音频数据的总长度,即文件总字节数减去wav文件头的长度
44Datalittle音频数据

**表2** 标准的`wav`文件头格式

通过wav文件头信息,我们可以计算出音频时长:

1
音频时长(s) = Subchunk2 Size / ByteRate

压缩编码格式

wav文件几乎支持所有ACM规范的编码格式,其信息存储在wav文件头偏移2021两个字节中,常见的压缩编码格式见表3

格式代码格式名称Format chunk 长度是否有Fact chunk
0 (0x0000)unknownunknownunknown
1 (0x0001)PCM/uncompressed16
2 (0x0002)Microsoft ADPCM18
3(0x0003)IEEE float18
6 (0x0006)ITU G.711 a-law18
7 (0x0007)ITU G.711 µ-law18
17 (0x0011)IMA ADPCMunknownunknown
20 (0x0016)ITU G.723 ADPCM (Yamaha)unknownunknown
49 (0x0031)GSM 6.1020
64 (0x0040)ITU G.721 ADPCMunknown
80 (0x0050)MPEGunknownunknown
65,534 (0xFFFE)扩展格式标识40unknown
65,536 (0xFFFF)Experimentalunknownunknown

**表3** 常见的压缩编码格式

扩展格式

当然,也不是所有的wav文件头都是44个字节的,比如通过FFmpge编码而来的wav文件头通常大于44个字节,目前比较常见的wav文件头长度有44字节、46字节、58字节和98字节。

Format chunk扩展

wav文件采用非PCM编码即压缩格式时,会扩展Format chunk,在其之后扩充了一个数据结构,见表4

file offset(bytes)Field nameField size(bytes)typedescription
24extand size2U16除其自身外的扩展区域长度
26extand area包含扩展的格式信息,其长度取决于压缩编码类型。当某种编码格式(如ITU G.711 a-law)使扩展区的长度为0时,该字段还必须保留,只是长度字段的数值为0。

**表4** 标准Format chunk扩展格式

由此可以得出,如果Subchunk1 Size等于0x10(16),表示不包含Format chunk扩展,wav文件头长度为44字节;如果大于0x10(16),则包含Format chunk扩展,扩展长度的最小值为18(16+2),此时wav文件头大于44字节。

当编码格式代码为0xFFFE时,Format chunk扩展长度为24字节,格式见表5

file offset(bytes)Field nameField size(bytes)typedescription
24扩展区长度2U16值为22
26有效采样位数2U16最大值为 每个采样字节数 * 8
28扬声器位置4U32声道号与扬声器位置映射的二进制掩码
32编码格式2U16真正的编码格式代码
3414值为{\x00, \x00, \x00, \x00, \x10, \x00, \x80, \x00, \x00, \xAA, \x00, \x38, \x9B, \x71}

**表5** 编码为0xFFFE的Format chunk扩展格式

Fact chunk

采用压缩编码(修订版Rev.3以后出现的编码格式)的wav文件必定有含有Fact chunk,其结构符合标准chunk结构,参见表1

Fact chunk的块标识符为”fact“,块长度至少为4个字节,目前其只有一个块数据内容,即每个声道采样总数,或采样帧总数。该值等于Subchunk2 Size / BlockAlign

值得注意的是,在实测中发现,将压缩编码格式文件转换成PCM编码格式后,原Fact chunk仍然存在。

wav文件动态解析库

wav文件格式是一种极其简单的文件格式,如果对其结构足够熟悉,完全可以通过代码正确读写,从而免去引入一些复杂的中间库,降低复杂度,提高工作效率。

这里提供了一个wav文件动态解析库,欢迎使用。

Reference

]]>
+ + + <p>本文将详细分析不同格式的<code>wav</code>文件。</p> + + + + + + + + + + +
+ + + inline使用注意事项 + + https://answerywj.com/2021/07/28/tips-of-inline/ + 2021-07-28T06:34:31.000Z + 2023-03-20T06:26:35.342Z + + GCC在不优化时不会内联任何函数,除非指定函数的“always_inline”属性。

先附上结论:**GCC在不优化时不会内联任何函数,除非指定函数的“always_inline”属性。**

测试代码:

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

inline void say(void) {
printf("Hello, World\n");
}

int main(void) {
say();
return 0;
}

使用-O3优化选项,一切正常:

1
2
3
4
$ gcc -O3 -o test_O3.o -c test.c
$ g++ test_O3.o -o test_O3
$ ./test_O3
Hello, World

使用-O0优化选项,链接时报错,提示找不到内联函数say

1
2
3
4
5
$ gcc -O0 -o test_O0.o -c test.c
$ g++ test_O0.o -o test_O0
test_O0.o: In function `main':
test.c:(.text+0x5): undefined reference to `say'
collect2: error: ld returned 1 exit status

分别查看文件test_O0.otest_O3.o

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ readelf -s test_O0.o

Symbol table '.symtab' contains 10 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS test.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 3
4: 0000000000000000 0 SECTION LOCAL DEFAULT 4
5: 0000000000000000 0 SECTION LOCAL DEFAULT 6
6: 0000000000000000 0 SECTION LOCAL DEFAULT 7
7: 0000000000000000 0 SECTION LOCAL DEFAULT 5
8: 0000000000000000 16 FUNC GLOBAL DEFAULT 1 main
9: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND say
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ readelf -s test_O3.o

Symbol table '.symtab' contains 13 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS test.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 2
4: 0000000000000000 0 SECTION LOCAL DEFAULT 3
5: 0000000000000000 0 SECTION LOCAL DEFAULT 4
6: 0000000000000000 0 SECTION LOCAL DEFAULT 5
7: 0000000000000000 0 SECTION LOCAL DEFAULT 6
8: 0000000000000000 0 SECTION LOCAL DEFAULT 9
9: 0000000000000000 0 SECTION LOCAL DEFAULT 10
10: 0000000000000000 0 SECTION LOCAL DEFAULT 8
11: 0000000000000000 21 FUNC GLOBAL DEFAULT 6 main
12: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND puts

可以发现文件test_O0.o中,inline修饰的函数say为未定义状态,说明inline函数并没有展开。

指定say函数为“always_inline”属性:

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

__attribute__((always_inline)) inline void say(void) {
printf("Hello, World\n");
}

int main(void) {
say();
return 0;
}

重新使用-O0优化选项编译运行,一切ok

1
2
3
4
5
$ gcc -O0 -o test.o -c test.c
$ gcc -O0 -o test_O0_2.o -c test.c
$ g++ test_O0_2.o -o test_O0_2
$ ./test_O0_2
Hello, World
]]>
+ + + <p><strong><code>GCC</code>在不优化时不会内联任何函数,除非指定函数的“<code>always_inline</code>”属性。</strong></p> + + + + + + + + + + +
+ + + getrusage-进程资源统计函数 + + https://answerywj.com/2021/06/23/getrusage/ + 2021-06-23T07:41:07.000Z + 2023-03-20T06:26:35.318Z + + getrusage用于统计系统资源使用情况,即进程执行直到调用该函数时的资源使用情况,如果在不同的时间调用该函数,会得到不同的结果。

简介

getrusage用于统计系统资源使用情况,即进程执行直到调用该函数时的资源使用情况,如果在不同的时间调用该函数,会得到不同的结果。

目前在LinuxmacOS支持该函数。

函数说明

原型

1
2
3
4
#include <sys/time.h>
#include <sys/resource.h>

int getrusage(int who, struct rusage *usage);

sys/time.h:为了得到timeval结构体的声明,这个结构体实际上在bits/time.h中声明。

参数

**who**:资源统计的对象,有如下取值:

  • RUSAGE_SELF:返回调用进程的资源使用统计信息,即该进程中所有线程使用的资源总和;
  • RUSAGE_CHILDREN:返回调用进程所有已终止且被回收子进程的资源使用统计信息。如果进程有孙子进程或更远的后代进程,且这些后代进程和这些后代进程与调用进程之间的中间进程也已终止且被回收,那么这些后代进程的资源使用统计信息也会被统计;
  • RUSAGE_THREADLinux 2.6.26起支持):返回调用线程的资源使用统计信息;
宏定义取值
RUSAGE_SELF0
RUSAGE_CHILDREN-1
RUSAGE_THREAD1

宏定义在sys/resource.h-> bits/resource.h

**usage**:资源使用统计信息,用如下结构体的形式返回到该指针指向的内存空间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct rusage {
struct timeval ru_utime; /* user CPU time used */
struct timeval ru_stime; /* system CPU time used */
long ru_maxrss; /* maximum resident set size */
long ru_ixrss; /* integral shared memory size */
long ru_idrss; /* integral unshared data size */
long ru_isrss; /* integral unshared stack size */
long ru_minflt; /* page reclaims (soft page faults) */
long ru_majflt; /* page faults (hard page faults) */
long ru_nswap; /* swaps */
long ru_inblock; /* block input operations */
long ru_oublock; /* block output operations */
long ru_msgsnd; /* IPC messages sent */
long ru_msgrcv; /* IPC messages received */
long ru_nsignals; /* signals received */
long ru_nvcsw; /* voluntary context switches */
long ru_nivcsw; /* involuntary context switches */
};

结构体struct rusage各个成员释义如下:

  • ru_utime:返回进程在用户模式下的执行时间,以timeval结构的形式返回(该结构体在bits/timeval中声明);
  • ru_stime:返回进程在内核模式下的执行时间,以timeval结构的形式返回(该结构体在bits/timeval中声明);
  • ru_maxrssLinux 2.6.32起支持):返回rss(实际使用物理内存,包含共享库占用的内存)的大小,单位为KB;当who被指定为RUSAGE_CHILDREN时,返回各子进程rss的大小中最大的一个,而不是进程树中最大的rss
  • ru_ixrss:目前不支持;
  • ru_idrss:目前不支持;
  • ru_isrss:目前不支持;
  • ru_minflt:缺页中断的次数,且处理这些中断不需要进行I/O,不需要进行I/O操作的原因是系统使用reclaiming的方式在物理内存中得到了之前被淘汰但是未被修改的页框。(第一次访问bss段时也会产生这种类型的缺页中断);
  • ru_majflt:缺页中断的次数,且处理这些中断需要进行I/O
  • ru_nswap:目前不支持;
  • ru_inblockLinux 2.6.22起支持):文件系统需要进行输入操作的次数;
  • ru_oublockLinux 2.6.22起支持):文件系统需要进行输出操作的次数;
  • ru_msgsnd:目前不支持;
  • ru_msgrcv:目前不支持;
  • ru_nsignals:目前不支持;
  • ru_nvcswLinux 2.6起支持):因进程自愿放弃处理器时间片而导致的上下文切换的次数(通常是为了等待请求的资源);
  • ru_nivcswLinux 2.6起支持):因进程时间片使用完毕或被高优先级进程抢断导致的上下文切换的次数;

    其中有些结构体成员目前并不被Linxu支持,但是为了兼容其它系统以及未来扩展,仍被保留了下来,这些结构体成员在函数执行后会被内核默认设置为0

返回值

成功0
失败-1,并设置errno的值,包含如下两种错误:

  • EFAULTusage指针指向不可访问地址;
  • EINVALwho被指定为无效值;

属性

getrusage函数是线程安全的。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>

/* include for getrusage */
#ifndef _WIN32
#include <sys/time.h>
#include <sys/resource.h>
#endif

static void print_rusage() {
#ifndef _WIN32
int ret;

struct rusage usage;
ret = getrusage(RUSAGE_SELF, &usage);
if (0 != ret) {
printf("getrusage failed\n");
goto end;
}

printf("%s: %.3fms\n", "ru_utime", (usage.ru_utime.tv_sec * 1000.0 + usage.ru_utime.tv_usec / 1000.0));
printf("%s: %.3fms\n", "ru_stime", (usage.ru_stime.tv_sec * 1000.0 + usage.ru_stime.tv_usec / 1000.0));
printf("%s: %.3fM\n", "ru_maxrss", (usage.ru_maxrss / 1024.0));
printf("%s: %ld\n", "ru_ixrss", usage.ru_ixrss);
printf("%s: %ld\n", "ru_idrss", usage.ru_idrss);
printf("%s: %ld\n", "ru_isrss", usage.ru_isrss);
printf("%s: %ld\n", "ru_minflt", usage.ru_minflt);
printf("%s: %ld\n", "ru_majflt", usage.ru_majflt);
printf("%s: %ld\n", "ru_nswap", usage.ru_nswap);
printf("%s: %ld\n", "ru_inblock", usage.ru_inblock);
printf("%s: %ld\n", "ru_oublock", usage.ru_oublock);
printf("%s: %ld\n", "ru_msgsnd", usage.ru_msgsnd);
printf("%s: %ld\n", "ru_msgrcv", usage.ru_msgrcv);
printf("%s: %ld\n", "ru_nsignals", usage.ru_nsignals);
printf("%s: %ld\n", "ru_nvcsw", usage.ru_nvcsw);
printf("%s: %ld\n", "ru_nivcsw", usage.ru_nivcsw);

#endif

end:
return;
}

完整代码:https://github.com/AnSwErYWJ/DogFood/blob/master/C/getrusage.c

]]>
+ + + <p><code>getrusage</code>用于统计系统资源使用情况,即进程执行直到调用该函数时的资源使用情况,如果在不同的时间调用该函数,会得到不同的结果。</p> + + + + + + + + +
+ + + RPATH与RUNPATH的区别 + + https://answerywj.com/2021/02/22/difference-between-RPATH-and-RUNPATH/ + 2021-02-22T10:26:04.000Z + 2023-03-20T06:26:35.318Z + + 本文从一个实际遇到的问题出发,分析 RPATHRUNPATH 的区别,以及产生的原因。

RPATH与RUNPATH的区别

年前升级了操作系统后,同样的代码在新系统编译后无法执行,提示找不到依赖库,本文用来记录一下是如何解决这个问题的。

源文件

main.c

1
2
3
4
5
6
#include "a.h"

int main() {
a();
return 0;
}

libA.so

1
2
3
4
5
6
// a.c
#include "b.h"

void a() {
b();
}
1
2
// a.h
void a();

ubuntu 16.04(gcc version 5.4.0)

1
$ gcc -fPIC -shared a.c -I. -L. -lB -o libA.so

libB.so

1
2
3
4
5
6
// b.c
#include <stdio.h>

void b() {
printf("Hello, World\n");
}
1
2
// b.h
void b();

ubuntu 16.04(gcc version 5.4.0)

1
$ gcc -fPIC -shared -I. b.c -o libB.so

**函数调用依赖关系:main -> a -> b**。

复现步骤

  1. 分别在 ubuntu 16.04(gcc version 5.4.0)ubuntu 20.04(gcc version 9.3.0) 编译可执行程序:

    1
    $ gcc -I. -o main main.c -Wl,--rpath,. -L. -lA -lB
  2. ubuntu 16.04(gcc version 5.4.0) 运行成功

    1
    2
    $ ./main
    Hello, World
  3. ubuntu 20.04(gcc version 9.3.0) 运行失败

    1
    2
    $ ./main 
    ./main: error while loading shared libraries: libB.so: cannot open shared object file: No such file or directory

    错误提示为找不到可执行程序 ./main 依赖的共享库 libB.so

问题原因

排除共享库本身问题

首先,由于 libA.solibB.so 是在 ubuntu 16.04(gcc version 5.4.0) 上编译的,所以重新在ubuntu 20.04(gcc version 9.3.0) 上编译 libA.solibB.so,并重复复现步骤,现象相同,说明不是 libA.solibB.so 导致的问题;

分析库查找过程

使用 **LD_DEBUG**,打开链接器的调试功能,分析共享库的查找过程:
ubuntu 16.04(gcc version 5.4.0)

1
2
3
4
5
6
7
8
9
10
11
$ LD_DEBUG=libs ./main                                                        [16:37:15]
22331:find library=libA.so [0]; searching
22331: search path=./tls/x86_64:./tls:./x86_64:.(RPATH from file ./main)
......
22331: trying file=./libA.so
......
22331:find library=libB.so [0]; searching
22331: search path=./tls/x86_64:./tls:./x86_64:.(RPATH from file ./main)
......
22331: trying file=./libB.so
......

ubuntu 20.04(gcc version 9.3.0)

1
2
3
4
5
6
7
8
9
10
11
12
$ LD_DEBUG=libs ./main
33218:find library=libA.so [0]; searching
33218: search path=./tls/haswell/x86_64:./tls/haswell:./tls/x86_64:./tls:./haswell/x86_64:./haswell:./x86_64:.(RUNPATH from file ./main)
......
33218: trying file=./libA.so
......
33218:find library=libB.so [0]; searching
33218: search cache=/etc/ld.so.cache
33218: search path=/lib/x86_64-linux-gnu/tls/haswell/x86_64:/lib/x86_64-linux-gnu/tls/haswell:/lib/x86_64-linux-gnu/tls/x86_64:/lib/x86_64-linux-gnu/tls:/lib/x86_64-linux-gnu/haswell/x86_64:/lib/x86_64-linux-gnu/haswell:/lib/x86_64-linux-gnu/x86_64:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu/tls/haswell/x86_64:/usr/lib/x86_64-linux-gnu/tls/haswell:/usr/lib/x86_64-linux-gnu/tls/x86_64:/usr/lib/x86_64-linux-gnu/tls:/usr/lib/x86_64-linux-gnu/haswell/x86_64:/usr/lib/x86_64-linux-gnu/haswell:/usr/lib/x86_64-linux-gnu/x86_64:/usr/lib/x86_64-linux-gnu:/lib/tls/haswell/x86_64:/lib/tls/haswell:/lib/tls/x86_64:/lib/tls:/lib/haswell/x86_64:/lib/haswell:/lib/x86_64:/lib:/usr/lib/tls/haswell/x86_64:/usr/lib/tls/haswell:/usr/lib/tls/x86_64:/usr/lib/tls:/usr/lib/haswell/x86_64:/usr/lib/haswell:/usr/lib/x86_64:/usr/lib(system search path)
......
./main: error while loading shared libraries: libB.so: cannot open shared object file: No such file or directory

结果在 ubuntu 20.04(gcc version 9.3.0) 中, 可以正确查找到 libA.so ,但是无法正确查找到 libB.so
libB.so 的查找路径是 system search path ,而非我们在编译时设定的查找时路径 ./ ,导致可执行程序无法加载 libB.so

动态链接器对共享库的查找顺序:

  1. LD_LIBRARY_PATH-L-rpath
  2. /etc/ld.so.cache
  3. 默认共享库目录:/usr/lib/lib

RPATH与RUNPATH的区别

由上分析可以得出是共享库运行时加载路径非法导致的问题,在排除设置 LD_LIBRARY_PATH 等环境变量的情况下,可以将焦点锁定在使用的链接选项 -rpath 上,查看源文件依赖:
ubuntu 16.04(gcc version 5.4.0)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ readelf -d main
Dynamic section at offset 0xe08 contains 26 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libA.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000f (RPATH) Library rpath: [.]

$ readelf -d libA.so
Dynamic section at offset 0xe08 contains 25 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libB.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]

$ readelf -d libB.so
Dynamic section at offset 0xe18 contains 24 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]

ubuntu 20.04(gcc version 9.3.0)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ readelf -d main 
Dynamic section at offset 0x2da8 contains 29 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libA.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000001d (RUNPATH) Library runpath: [.]

$ readelf -d libA.so
Dynamic section at offset 0xe08 contains 25 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libB.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]

$ readelf -d libB.so
Dynamic section at offset 0xe18 contains 24 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]

发现在 ubuntu 20.04(gcc version 9.3.0)RPATH 变成了 RUNPATH ,说明链接器选项 -rpath 的行为发生了改变。

源文件依赖关系:main -> libA.so -> libB.so

综上,问题的原因是 ubuntu 20.04(gcc version 9.3.0) 上,链接器选项 -rpath 的行为发生改变,默认配置为 RUNPATH 而不是 RPATH;由于 RUNPATH 不适用于间接依赖的库,所以导致在 ubuntu 20.04(gcc version 9.3.0) 上只能正确查找到 libA.so ,而无法正确查找到 libB.so

gcc version >= 7.5.0时,-rpath默认行为即发生改变。

解决方案

LD_LIBRARY_PATH(不推荐)

LD_LIBRARY_PATH 是一个环境变量,作用是临时改变链接器的加载路径,可以存储多个路径,用冒号分隔:

1
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./libs

不推荐的原因:

  1. 若全局设置 LD_LIBRARY_PATH,会影响其它应用程序的共享库加载过程;
  2. 若只在该应用程序启动时局部设置 LD_LIBRARY_PATH,则每次启动都需要设置,步骤过于繁琐;

–disable-new-dtags

可以使用 -Wl,--disable-new-dtags 选项来使链接器保持旧行为,即在 ubuntu 20.04(gcc version 9.3.0) 使用如下命令编译:

1
$ gcc -I. -o main main.c -Wl,--disable-new-dtags,--rpath,. -L. -lA -lB

重新运行并查看依赖:

1
2
3
4
5
6
7
8
9
$ ./main 
Hello, World

$ readelf -d main
Dynamic section at offset 0x2da8 contains 29 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libA.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000f (RPATH) Library rpath: [.]

可执行程序 main 可以正确运行,RUNPATH 也变成了 RPATH,链接器行为与 ubuntu 16.04(gcc version 5.4.0) 保持一致了。

同理,也有 -Wl,--enable-new-dtags 选项来使链接器保持新行为

如下为官方解释:

1
2
3
--enable-new-dtags
--disable-new-dtags
This linker can create the new dynamic tags in ELF. But the older ELF systems may not understand them. If you specify --enable-new-dtags, the new dynamic tags will be created as needed and older dynamic tags will be omitted. If you specify --disable-new-dtags, no new dynamic tags will be created. By default, the new dynamic tags are not created. Note that those options are only available for ELF systems.

参考

]]>
+ + + <p>本文从一个实际遇到的问题出发,分析 <code>RPATH</code> 与 <code>RUNPATH</code> 的区别,以及产生的原因。</p> + + + + + + + + + + + + +
+ + + Git速查手册(第三版) + + https://answerywj.com/2020/09/29/git-help-v3/ + 2020-09-29T07:13:42.000Z + 2023-08-30T09:06:22.963Z + + 本文是对Git速查手册(第二版)的更新,补充了一些近期使用或者收集的一些命令。

下载与安装

Git下载地址:https://git-scm.com/downloads,安装请参考页面说明。

建议使用版本v1.8及以上。

配置

Git配置分为三个级别:

  • --system:系统级,位于 /etc/gitconfig
  • --global:用户级,位于 ~/.gitconfig
  • --local:仓库级,位于 [repo]/.git/config,为默认级别且优先级最高

用户信息

删除global用户信息,防止不同Git服务之间冲突:

1
2
$ git config --global --unset user.name
$ git config --global --unset user.email

配置用户名:

1
2
$ git config --local user.name "username"
$ git config --local user.email "email"

克隆协议

一般Git服务默认都支持SSHHTTPSSSH支持的原生Git协议速度最快,HTTPS除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令。

SSH

检查本机SSH公钥,若存在,则将id_rsa.pub添加到Git服务的SSH keys

1
$ ls ~/.ssh

若不存在,则生成:

  • 单个Git服务
    1
    $ ssh-keygen -t rsa -C "your_email@youremail.com"
  • 多个Git服务
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    $ ssh-keygen -t rsa -C "your_email@youremail.com" -f "git1_id_rsa"
    $ ssh-keygen -t rsa -C "your_email@youremail.com" -f "git2_id_rsa"
    $ cp git1_id_rsa* ~/.ssh/
    $ cp git2_id_rsa* ~/.ssh/

    # 创建配置文件
    $ vi ~/.ssh/config

    # git1
    Host git1.com
    HostName git1.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/git1_id_rsa

    # git2
    Host git2.com
    HostName git2.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/git2_id_rsa

配置完成后,将对应的id_rsa.pub添加到Git服务的SSH keys,再次检查ssh连接情况;若不生效,则重启后再尝试:

1
2
$ ssh -T git@github.com
Hi! You’ve successfully authenticated, but GitHub does not provide shell access.

若出现上述信息,则表示设置成功。

克隆:

1
$ git clone git@git.server:test.git

HTTPS

关闭ssl校验:

1
$ git config --global http.sslverify false

克隆:

1
$ git clone https://git.server/test.git

协议切换

查看当前协议:

1
$ git remote -v

https切换至ssh

1
git remote set-url origin git@domain:username/ProjectName.git

ssh切换至https

1
git remote set-url origin https://domain/username/ProjectName.git

自定义配置

超时时间

1
$ git config --global credential.helper 'cache --timeout=3600'

保存用户凭证

1
$ git config --global credential.helper store

执行后,下次操作输入的用户名和密码会被保存,后续不必手动输入用户名和密码。若同时使用不同的Git服务,则不推荐使用。

多Git服务

若同时使用不同的Git服务,可以根据目录配置用户信息(需要使用v2.13.0及以上版本):

  • 首先修改用户目录下的 .gitconfig,通过 includeIf 配置不同目录的配置文件:

    1
    2
    3
    4
    5
    6
    7
    8
    - [user]
    - name = weijie.yuan
    - email = weijie.yuan@gitlab.com

    + [includeIf "gitdir:~/github/"]
    + path = .gitconfig-github
    + [includeIf "gitdir:~/gitlab/"]
    + path = .gitconfig-gitlab
  • 根据配置的 path,分别创建 .gitconfig-github 文件和 .gitconfig-gitlab 文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ vi .gitconfig-github
    [user]
    name = weijie.yuan
    email = weijie.yuan@github.com

    $ vi .gitconfig-gitlab
    [user]
    name = weijie.yuan
    email = weijie.yuan@gitlab.com

    includeIf 配置有如下规则:

  • 家目录下的 .gitconfigincludeIf 后面的 path 最后需要 / 结尾;

  • 家目录下的 .gitconfig ,原有的 user 部分需要删除;

  • 家目录下的 .gitconfigincludeIf中配置的各个目录,不能是包含关系;

文本编辑器

Linux or MacOS

1
$ git config --global core.editor vim

Windows

1
> git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

文本比较合并工具

查看支持的工具集合(推荐使用meld):

1
$ git difftool --tool-help

Linux or MacOS

1
2
$ git config --global diff.tool meld
$ git config --global merge.tool meld

Windows

1
2
3
4
5
> git config --global diff.tool meld
> git config --global merge.tool meld
> git config --global difftool.bc3.path 'C:\Program Files (x86)\Meld\Meld.exe'
> git config --global mergetool.meld.path 'C:\Program Files (x86)\Meld\Meld.exe'
> git config --global difftool.meld.path 'C:\Program Files (x86)\Meld\Meld.exe'

显示颜色

1
$ git config --global color.ui.true

操作别名

示例,将checkout设置为别名co

1
$ git config --global alias checkout co 

查看所有配置

1
2
3
$ git config --local --list
$ git config --global --list
$ git config --system --list

基础操作

工作流

工作流

工作区就是你的本地仓库目录,不过其中的.git目录不属于工作区,而是版本库,里面存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

查看状态:

1
$ git status

添加修改到暂存区:

1
2
3
$ git add <filename> 
$ git add . # 添加当前目录所有修改过的文件
$ git add * # 递归地添加执行命令时所在的目录中的所有文件

提交修改到版本库:

1
2
$ git commit -m "commit message"
$ git commit -am "commit message" # am:将添加和提交合并为一步,但只对本来就存在的文件有效

commit message的填写可以参考写好 Git Commit 信息的 7 个建议

现在来解释一下前面的添加和提交操作:

  1. git add:把文件修改添加到暂存区;
  2. git commit:把暂存区的所有内容提交到当前分支,即版本库;

版本历史记录

查看当前仓库所有文件的版本历史记录:

1
$ git log

查看每个文件的版本历史记录:

1
$ git log <filename>

查看包含指定关键字的版本历史记录:

1
$ git log --grep="keywords"

查看指定时间段的版本历史记录,如下示例时间段为2020.9.23全天:

1
$ git log --after="2020-9-23 00:00:00" --before="2020-9-23 23:59:59"

暂存

当你需要切换分支时,若当前工作区还有些修改没有完成、又不适合提交的,操作切换分支是会提示出错的,这时就需要将这些修改暂存起来:

1
$ git stash save "message"

查看:

1
$ git stash list

恢复:

1
2
3
$ git stash pop [--index] [stash@{num}] 
or
$ git stash apply [--index] [stash@{num}] # 不删除已恢复的进度.

--index表示不仅恢复工作区,还会恢复暂存区;num是你要恢复的操作的序列号,默认恢复最新进度。

删除进度:

1
2
$ git stash drop [stash@{num}] # 删除指定进度
$ git stash clear # 删除所有

撤销与回退

查看当前仓库状态:

1
$ git status

查看文件更改:

1
2
$ git difftool <filename>
$ git mergetool <filename>

查看提交历史:

1
2
$ git log
$ git log --pretty=oneline #只保留commit id 和 commit message

撤销工作区Tracked files的修改:

1
$ git checkout -- <filename>

撤销工作区Untracked files的修改:

  • n:查看将会删除的文件,防止误删;
  • f:Untracked的文件;
  • d:Untracked的目录;
  • x:包含gitignoreUntracked文件和目录一并删掉,慎用!;
1
git clean -nfd

只回退暂存区(git add),不删除工作空间代码:

1
$ git reset HEAD <filename> # 无filename则默认回退全部 

回退版本区(git commit)和暂存区(git add),不删除工作空间代码:

1
2
$ git reset --mixed HEAD^ # --mixed为默认参数
$ git reset HEAD^

回退版本区(git commit),但是不回退暂存区(git add),不删除工作空间代码:

1
$ git reset --soft HEAD^

回退版本区(git commit)和暂存区(git add),并删除工作空间代码(不包括Untracked files),执行后直接恢复到指定<commit-id>状态:

1
$ git reset --hard <commit-id>

HEAD表示当前版本,HEAD^表示上个版本,HEAD^^表示上上个版本,上100个版本可以表示为HEAD~100以此类推。

回退版本后,若需要返回原来的版本,会发现找不到未来的commit id,则需要查看操作命令历史进行查找:

1
$ git reflog

从版本库删除文件:

1
$ git rm <filename>

若你的代码已经push到线上,则推荐使用下面这个命令回滚:

1
$ git revert <commit-id>

revert是用一次新的commit来回滚之前的commit,更安全;reset则是直接删除指定的commit,若直接push会导致冲突。

使用帮助

查看帮助:

1
$ git --help

仓库管理

推送本地修改到远程仓库

1
$ git push -u origin <feature-branch-name>

-u选项可以将本地分支与远程分支关联,下次git pull操作时可以不带参数.具体参见这里

添加本地仓库到远程

1
2
3
$ cd repo
$ git init
$ git remote add origin git@github.com:USERNAME/repo.git

origin就是一个名字,是git为你默认创建的指向这个远程代码库的标签。

获取远程仓库

1
$ git clone git@github.com:USERNAME/repo.git

查看远程仓库

1
2
3
$ git remote -v
origin git@github.com:USERNAME/repo.git (push)
origin git@github.com:USERNAME/repo.git (fetch)

关联远程仓库

1
$ git remote add upstream git@github.com:USERNAME/repo.git

同步远程仓库的更新

1
2
3
4
5
6
7
8
9
10
$ git remote -v
origin git@github.com:USERNAME/repo.git (push)
origin git@github.com:USERNAME/repo.git (fetch)
upstream git@github.com:USERNAME/repo.git (push)
upstream git@github.com:USERNAME/repo.git (fetch)

$ git fetch upstream
$ git difftool <branch-name> upstream/master
$ git merge upstream/master
$ git mergetool

仓库引用(自仓库)

Git包含submodulesubtree两种引用方式,官方推荐使用subtree替代submodule

submodule

添加子模块
1
$ git submodule add git@github.com:USERNAME/repo.git <submodule-path>

执行成功后,暂存区会有两个修改:.gitmodules和命令中<submodule-path>指定的路径。

提交更新:

1
2
$ git commit
$ git push
使用子模块

克隆使用了子模块的项目后,默认其子模块目录为空,需要在项目根目录执行如下命令单独下载:

1
2
3
4
5
6
$ git submodule update --init --recursive

or

$ git submodule init
$ git submodule update
更新子模块

子模块仓库更新后,使用子模块的项目必须手动更新才能同步最新的提交:

1
2
$ cd <submodule-path>
$ git pull

完成后返回项目根目录,可以看到子模块有待提交的更新,执行提交即可:

1
2
3
$ git add .
$ git commit
$ git push
删除子模块

删除子模块目录及源码:

1
$  rm -rf <submodule-path>

删除项目根目录下.gitmodules文件中待删除的子模块相关条目:

1
$ vi .gitmodules 

删除版本库下的子模块目录,每个子模块对应一个目录,只删除对应的子模块目录即可:

1
rm -rf .git/module/<submodule-path>

删除子模块缓存:

1
git rm --cached <submodule-path>

提交更新:

1
2
3
$ git add .
$ git commit
$ git push

subtree

1
2
3
4
5
6
7
8
9
# 第一次初始化
$ git remote add -f <remote-subtree-repository-name> <remote-subtree-repository-url>
$ git subtree add --prefix=<local-subtree-directory> <remote-subtree-repository> <remote-subtree-branch-name> --squash

# 同步subtree的更新
$ git subtree pull --prefix=<local-subtree-directory> <remote-subtree-repository> <remote-subtree-branch-name> --squash

# 推送到远程subtree库
$ git subtree push --prefix=<local-subtree-directory> <remote-subtree-repository> <remote-subtree-branch-name>

清理仓库

清理本地无效的远程追踪分支

1
2
3
$ git pull # 拉取更新
$ git remote prune origin --dry-run # 列出所有可以从本地仓库中删除的远程追踪分支
$ git remote prune origin # 清理本地无效的远程追踪分支

清理无用的分支和标签

1
2
$ git branch -d <branch-name>
$ git tag -d <tag-name>

清理大文件

  • 查看仓库占用空间:

    1
    2
    $ git count-objects -v
    $ du -sh .git
  • 寻找大文件ID

    1
    $ git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10

    输出的第一列是文件ID,第二列表示文件(blob)或目录(tree),第三列是文件大小,此处筛选了最大的10条。

  • 根据文件ID映射文件名:

    1
    $ git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}')"
  • 根据文件名,从所有提交中删除文件:

    1
    $ git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch [FileName]' --prune-empty --tag-name-filter cat -- --all
  • 删除缓存下来的refgit操作记录:

    1
    2
    $ git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
    $ git reflog expire --expire=now --all
  • 清理.git目录并推送到远程:

    1
    2
    $ git gc --prune=now
    $ git push -f --all

    在执行push操作时,git会自动执行一次gc操作,不过只有loose object达到一定数量后才会真正调用,建议手动执行。

  • 重新查看仓库占用空间,发现较清理前变小很多:

    1
    2
    $ git count-objects -v
    $ du -sh .git

清理大型二进制文件

由于Git在存储二进制文件时效率不高,所以需要借助第三方组件

分支管理

查看分支

查看所有分支:

1
$ git branch -a

*标记的是当前分支。

查看某个<commit id>属于哪个分支:

1
$ git branch -a --contains <commit id>

创建分支

在本地创建分支:

1
$ git branch <newbranch> # 创建

在本地创建分支并切换:

1
$ git checkout -b <newbranch> # 创建并切换

从标签创建分支:

1
2
$ git branch <newbranch> <tagname>
$ git checkout <newbranch> # 切换到新建分支

获取远程分支到本地并创建本地分支:

1
$ git checkout -b <local-branch> <remote-branch>

推送新建本地分支到远程:

1
2
3
$ git push -u origin <remote-branch-name>
or
$ git push --set-upstream origin <remote-branch-name>

创建空白分支

创建一个分支,该分支会包含父分支的所有文件,但不会指向任何历史提交:

1
$ git checkout --orphan <newbranch>

删除所有文件:

1
$ git rm -rf .

提交分支:

1
2
3
4
$ echo '# new branch' >> README.md
$ git add README.md
$ git commit
$ git push origin <remote-branch-name>

删除分支

删除本地分支:

1
$ git branch -d <branch>

若当前分支因为有修改未提交或其它情况不能删除,请使用-D选项强制删除。

清理无用的本地分支:

1
$ git remote prune origin

通常在remote上的分支被删除后,更新本地分支列表时使用。

删除远程分支(三种方法):

1
2
3
$ git push origin --delete <remote-branch-name>
$ git push origin -d <remote-branch-name>
$ git push origin :<remote-branch-name>

更新分支

获取远程分支到本地已有分支:

1
$ git branch --set-upstream <local-branch> origin/branch

同步当前分支的所有更新,使用git pull并不保险:

1
2
3
4
5
6
7
8
# 下载最新的代码到远程跟踪分支, 即origin/<branch-name>
$ git fetch origin <branch-name>
# 查看更新内容
$ git difftool <branch-name> origin/<branch-name>
# 尝试合并远程跟踪分支的代码到本地分支
$ git merge origin/<branch-name>
# 借助mergetool解决冲突
$ git mergetool

同步其它分支的所有更新,本例拉取master分支更新:

1
2
3
4
$ git fetch origin master
$ git difftool <branch-name> origin/master
$ git merge origin/master
$ git mergetool

同步其它分支的部分更新,即同步某几次提交:

1
2
3
4
5
6
7
8
# 同步提交A
$ git cherry-pick <commit id A>
# 同步提交A和B
$ git cherry-pick <commit id A> <commit id B>
# 同步提交A到B的所有提交(不包括A),提交A必须早于提交B,否则命令将失败,但不会报错
$ git cherry-pick <commit id A>..<commit id B>
# 同步提交A到B的所有提交(包括A),提交A必须早于提交B,否则命令将失败,但不会报错
$ git cherry-pick <commit id A>^..<commit id B>

标签管理

查看标签

1
$ git tag

创建标签

1
2
$ git tag -a <tagname> -m "tag message" # 创建标签在当前最新提交的commit上
$ git tag -a <tagname> -m "tag message" <commit id> # 创建标签在指定的commit上

若创建标签基于的commit被删除,标签不会被影响,依旧存在。

推送标签

推送标签到远程服务器:

1
2
$ git push origin <tagname> # 推送一个本地标签
$ git push origin --tags # 推送全部未推送过的本地标签

删除标签

1
2
$ git tag -d <tagname> # 删除一个本地标签
$ git push origin :refs/tags/<tagname> # 删除一个远程标签

进阶技巧

忽略特殊文件

当你的仓库中有一些文件,类似密码或者数据库文件不需要提交但又必须放在仓库目录下,每次git status都会提示Untracked,看着让人很不爽,提供两种方法解决这个问题。

本地忽略

在代码仓库目录创建一个.gitignore文件,编写规则如下:

1
2
3
tmp/  # 忽略tmp文件夹下所有内容
*.ini # 忽略所有ini文件
!data/ #忽略除了data文件夹的所有内容

.gitignore模版

全局忽略

在用户目录创建一个.gitignore_global文件,编写规则同.gitignore,并修改~/.gitconfig

1
2
[core]
excludesfile = ~/.gitignore_global

如果添加的忽略对象已经Tracked,纳入了版本管理中,则需要在代码仓库中先把本地缓存删除,改变成Untracked状态:

1
$ git rm -r --cached .

重写历史(慎用!)

修改历史提交(变基)

1
2
$ git rebase -i [git-hash| head~n]
$ git push -f # 不强制 push 会多一条 merge 提交信息

其中git-hash是你要开始进行rebasecommithash,而head~n则是从HEAD向前推ncommit

修改最近一次提交信息

1
$ git commit --amend

修改提交记录中的用户信息

修改最近一次提交的用户信息:

1
$ git commit --amend --author="GIT_AUTHOR_NAME <GIT_AUTHOR_EMAIL>"

全局修改用户信息:

1
2
3
4
5
6
7
8
9
$ git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_EMAIL" = "xxx@localhost" ];
then
GIT_AUTHOR_NAME="xxx";
GIT_AUTHOR_EMAIL="xxx@example.com";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD --all

Reference

]]>
+ + + <p>本文是对<a href="https://answerywj.com/2019/02/12/git-help-v2/">Git速查手册(第二版)</a>的更新,补充了一些近期使用或者收集的一些命令。</p> + + + + + + + + +
+ + + 写好技术简历的一些建议 + + https://answerywj.com/2020/07/03/gudie-of-technical-resume/ + 2020-07-03T03:00:04.000Z + 2023-03-20T06:26:35.322Z + + 根据我求职与招聘的经验,结合网上相关资料,这里整理了一些写好技术简历的建议。

这里提供了一份简历模版,可供参考。

保证内容真实性

写简历必须要保证内容的真实性,这是候选人个人诚信的体现,无论在简历中如何自夸,最终会在面试过程中也会露怯;同时现在大部分企业在招聘时,都会进行背调,所以请务必保证简历内容包括面试过程的真实性,实事求是,“知之为知之,不知为不知”

项目描述不是流水账

对于技术人员来说,项目经历是简历的主体,也是简历中最需要突出的部分,项目中涉及的技能和成果等,是对求职者能力最具说服力的证明。

据说,谷歌要求求职者描述项目经历时,必须提供下面三个信息:

  • 做了什么产品
  • 用到了什么技术
  • 取得了什么结果(量化

这里我认为还可以增加一个信息,即在项目中的角色:

  • 独立完成开发
  • 协作开发,为主导开发,或辅助开发
  • 团队领导者,团队规模为多少人

比如,”在 xx 产品中,主导开发了 xx 功能,使用了 xx 技术,解决了 xx 问题,带来了 xx 增长或收入”。

特别需要注意的是,取得的结果一定要量化,如功能被多少人使用、性能提升多少倍、节约了多少成本、带来了多少收益等等

除此之外,还请注意下面几点:

  • 挑选近 3~5 年内的项目,除非特别有价值,否则不要描述过于旧的项目;
  • 将项目分类,每类挑选 2~3 个核心的项目详细描述,其余可一笔带过;
  • 量化项目结果时,注重实际收益,如用户增长、经济收益等;

筛选专业技能

我遇到过很多刚毕业或毕业不久的求职者,简历中的专业技能十分齐全,但是面试过程中却发现大多的技能,仅仅是接触过或者在学校学过,这会给人感觉“你什么都会一点,但是什么都不精通”,这样做的伤害大于帮助。

所以,请筛选你的专业技能,建议可以按照熟练程度进行分类:

  • 了解:有使用过该技能做过一点东西,清楚其使用场景、能够解决的问题;若面试官提及,能够接上话;
  • 熟悉:经常性使用该技能、以该技能为主进行研发,对其原理有初步了解;若面试官提及,能够有来有回的聊起来;
  • 精通(慎用):熟练使用该技能,对其原理理解透彻;若面试官提及,能够直接碾压他!

最后,与专业无关的技能切勿出现在简历中,那这些内容对企业没用,缺乏针对性,只会浪费简历空间,如在校上过的课程、得过的奖学金、当过学生会干部,会计证、驾驶证、英语四六级考试等。

具有岗位相关性

企业招聘的目的,是希望找到能够帮助它干活或解决问题的人,仅仅通过一份简历,它也没有把握什么样的人匹配这个岗位,所以它只能假设如果你掌握了这个岗位所需要的某几种核心专业技能,你就是初步合格的候选人。

所以简历应该针对每个应聘的岗位,突出该岗位所需要的项目经历和专业技能,来证明你可以胜任这份工作。

页数不超过三页

简历是求职者用来向企业传递信息的,一般来说企业招聘人员在筛选简历时,阅读简历的时间不会超过半分钟,如果看不到想要的点,就会直接 pass;所以一定要突出重点内容,不要写得密密麻麻,堆砌各种无关的信息,这样只会增加简历的阅读难度,让招聘人员抓不到重点,对于技术人员来说,重点就是你的项目经历以及专业技能。

避免错别字和语法错误

简历中应该避免出现错别字、语法错误等低级错误,这很有可能会给企业留下不严谨、做事马虎的印象;同时技术名词大小写也应该遵循业内规范,保持专业性。

如果对自己不放心,可以在发送简历之前,请朋友检查一遍简历。

自我评价

一般简历中,都会要求候选人进行自我评价,请注意不要描述自己的工作态度,如积极进取、工作努力等,这是默认应该做到的,不是加分项。
自我评价可以针对如下四点进行:

  • 学习能力
  • 沟通能力
  • 协作能力
  • 执行能力

优化细节

优化企业招聘人员在阅读简历时的体验,使你的简历比别人读起来更舒服,自然简历通过的机会也会更高,可以关注以下细节:

  • 在各类联系方式后面,注明最优联系时间,以免错过面试邀约;
  • 若手机为外地号码,最好注明;
  • 简历使用 markdown 编写,转换成 pdf 格式发出,可以避免样式丢失或格式不兼容;

写在最后

重中之重,还是需要提高自己的能力,正所谓 “酒香不怕巷子深“

Reference

]]>
+ + + <p>根据我求职与招聘的经验,结合网上相关资料,这里整理了一些写好技术简历的建议。</p> + + + + + + + + + + + + +
+ + + --hash-style兼容性问题 + + https://answerywj.com/2020/05/14/ld-hash-style/ + 2020-05-14T07:54:25.000Z + 2023-03-20T06:26:35.334Z + + 本文记录了解决 --hash-style 兼容性问题的过程。

问题

1
dlopen failed: empty/missing DT_HASH in "libxxx.so" (built with --hash-style=gnu?)

最近,稳定性监控平台,被这一行错误日志霸榜,刚看到时也一脸懵逼,下面我们来逐步分析。

名词解释

首先需要查阅一下相关文档,了解一下其中的”新朋友”。

  • DT_HASH

    1
    ELF 中的一个 Sections,保存了一个用于查找符号的散列表,用于支持符号表的访问,能够提高符号搜索速度。
  • --hash-style=style(以下解释摘自 man ld)

    1
    Set the type of linker's hash table(s). style can be either "sysv" for classic ELF ".hash" section, "gnu" for new style GNU ".gnu.hash" section or "both" for both the classic ELF ".hash" and new style GNU ".gnu.hash" hash tables. The default is "sysv".

实验

通过查阅 --hash-style=style 参数,发现 style 支持三种配置:sysvgnuboth,废话不多说,先试一把。

  • gcc -Wl,--hash-style=sysv

    1
    2
    $ readelf -S libxxx.so  | grep "hash"
    [ 4] .hash HASH 0000000000003120 00003120
  • gcc -Wl,--hash-style=gnu

    1
    2
    $ readelf -S libxxx.so  | grep "hash"
    [ 4] .gnu.hash GNU_HASH 0000000000003120 00003120
  • gcc -Wl,--hash-style=both

    1
    2
    3
    $ readelf -S libxxx.so  | grep "hash"
    [ 4] .gnu.hash GNU_HASH 0000000000003120 00003120
    [ 5] .hash HASH 00000000000035f8 000035f8

-Wl 用于编译器向链接器传递参数。

如上,发现使用不同的配置,Sections Name 不同。

.gnu.hash 段​,提​供了​与 hash 段​相​同​的​功​能​;但​是与 hash 相比,增加了某些限制(附加规则),​导致了不兼容,带​来​了​ 50% 的​动​态​链​接​性​能​提​升​,具体参见 https://blogs.oracle.com/solaris/gnu-hash-elf-sections-v2

分析

结合实验结果,我先翻译一下问题中的那一行错误日志:

1
动态库加载失败,libxxx.so 中 DT_HASH 为空或者丢失,是不是用了 --hash-style=gnu 编译?

结合上表,若 --hash-style=gnu,那么 Section Name 就是 .gnu.hash 了,当然找不到.hash 了。

再查阅一下 Makefile 配置,发现并没有相关配置,怀疑是编译器的默认配置:

1
2
$ gcc -dumpspecs | grep "hash"
... --hash-style=gnu ...

-dumpspecs 参数可以打印编译器的内置规范。

果不其然,默认的 --hash-style 配置为了 gnu

结论

输出的动态库的 --hash-stylegnu,而目标系统并不能正确读取 --hash-stylegnu 的动态库,导致了如上的错误。

解决方案

配置 --hash-styleboth

1
LDFLAGS += -Wl,--hash-style=both

参考

]]>
+ + + <p>本文记录了解决 <code>--hash-style</code> 兼容性问题的过程。</p> + + + + + + + + + + + + +
+ + + Homebrew + + https://answerywj.com/2020/02/17/homebrew-in-mac/ + 2020-02-17T12:42:48.000Z + 2023-03-20T06:26:35.322Z + + 本文将介绍Homebrew的安装与使用。

Homebrew

简介

HomebrewOS X上类似于apt-getyum的软件包管理器,软件源依托于Github之上,所以在国内的网络环境之下,常常会出现使用Homebrew安装软件时,如brew install sshfs,经常会长时间卡在Updating Homebrew...

OS X 10.9开始支持

安装

首先安装依赖Xcode命令行工具

1
$ xcode-select --install

然后安装Homebrew

1
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

卸载

1
2
$ ruby -e "$(curl -fsSL $https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
$ sudo rm -rf /usr/local/

解决软件源更新慢问题

取消更新

当安装过程中,卡在Updating Homebrew...时,我们可以按住control + c,来取消本次更新;之后命令行会显示^C,表示取消成功,后面会继续安装工作。

这个方法是临时,仅在本次安装生效。

关闭自动更新

Homebrew的软件源更新,是在每次安装时自动执行的,可以通过配置进行关闭。

zsh终端方式:

1
2
$ echo 'export HOMEBREW_NO_AUTO_UPDATE=true' >> ~/.zshrc
$ source ~/.zshrc

bash终端方式:

1
2
$ echo 'export HOMEBREW_NO_AUTO_UPDATE=true' >> ~/.bash_profile
$ source ~/.bash_profile

这个方法是永久的,每次安装都会生效,但弊端是无法获取最新的软件。

替换软件源

这里推荐中科大的镜像源,亲测可用。

替换homebrew源

1
2
$ cd "$(brew --repo)"
$ git remote set-url origin https://mirrors.ustc.edu.cn/brew.git

还原官方源:

1
2
$ cd "$(brew --repo)"
$ git remote set-url origin https://github.com/Homebrew/brew.git

替换homebrew-core源(核心软件仓库)

1
2
$ cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
$ git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git

还原官方源:

1
2
$ cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
$ git remote set-url origin https://github.com/Homebrew/homebrew-core.git

替换homebrew-cask源(macOS应用)

1
2
$ cd "$(brew --repo)"/Library/Taps/homebrew/homebrew-cask 
$ git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git

若提示找不到"$(brew --repo)"/Library/Taps/homebrew/homebrew-cask,则:

1
2
$ cd "$(brew --repo)"/Library/Taps/homebrew/
$ git clone https://mirrors.ustc.edu.cn/homebrew-cask.git

还原官方源:

1
2
$ cd "$(brew --repo)"/Library/Taps/homebrew/homebrew-cask  
$ git remote set-url origin https://github.com/Homebrew/homebrew-cask

brew cask安装软件,会自动创建软链接到Application目录,这样在Launchpad中也能查看到安装的软件,方便启动软件

替换homebrew bottles源(预编译二进制软件包)

zsh终端方式:

1
2
$ echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.zshrc
$ source ~/.zshrc

bash终端方式:

1
2
$ echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.bash_profile
$ source ~/.bash_profile

还原官方源:进入如上终端配置文件,并删除HOMEBREW_BOTTLE_DOMAIN改行配置,并
source终端配置文件,使之生效。

常见错误

  • Error: Another active Homebrew update process is already in progress.
    解决方法:rm -rf /usr/local/var/homebrew/locks

Homebrew常用命令

  • 查看Homebrew版本:

    1
    $ brew -v
  • Homebrew帮助信息:

    1
    $ brew [cask] -h
  • 更新Homebrew:

    1
    $ brew update
  • 更新Homebrew cask:

    1
    $ brew cask upgrade
  • 安装软件:

    1
    $ brew [cask] install <packageName>
  • 卸载软件:

    1
    $ brew [cask] uninstall <packageName>
  • 查询可用软件:

    1
    $ brew search <packageName>
  • 查看已安装软件:

    1
    $ brew [cask] list
  • 查看软件信息:

    1
    $ brew [cask] info <packageName>

确认shell版本方式

1
$ echo $SHELL

输出/bin/zshzsh终端,输出/bin/bashbash终端。

]]>
+ + + <p>本文将介绍<code>Homebrew</code>的安装与使用。</p> + + + + + + + + + + +
+ + + Git仓库过大导致clone失败的解决方法 + + https://answerywj.com/2019/09/09/git-clone-extra-large-project/ + 2019-09-09T04:00:40.000Z + 2023-03-20T06:26:35.322Z + + 本文记录工作中遇到的clone大仓库失败的解决过程,以下问题与解决方案均基于https访问。

错误一

web端查看仓库大小,大约1.5G左右,首先直接执行git clone,报错如下:

1
2
3
4
5
6
remote: Counting objects: 10994, done.
remote: Compressing objects: 100% (3085/3085), done.
error: RPC failed; curl 56 GnuTLS recv error (-110): The TLS connection was non-properly terminated.
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

增大postBuffer

在增大postBuffer的同时,关闭ssl认证:

1
2
$ git config --global http.postBuffer 2048000000 # 设置为2G
$ git config --global http.sslVerify false # 关闭sslVerify

设置成功后,重新clone,错误依旧。

使用openssl替换gunssl

1.安装相关依赖环境:

1
$ sudo apt-get install build-essential fakeroot dpkg-dev libcurl4-openssl-dev

2.获取git源码:

1
$ sudo apt-get source git

若出现如下错误:

1
E: You must put some 'source' URIs in your sources.list

则需要将设置->Software & Updates->Ubuntu Software->Source code勾选:
source_code

若出现如下错误:

1
couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied) [duplicate]

则需要更改权限:

1
sudo chown _apt /var/lib/update-notifier/package-data-downloads/partial/

3.安装git的依赖

1
$ sudo apt-get build-dep git

4.进入git目录,重新编译:

1
2
3
4
$ cd git-2.7.4/
$ vim ./debian/control # 将libcurl4-gnutls-dev修改为libcurl4-openssl-dev
$ vim ./debian/rules # 整行删除TEST=test
$ sudo dpkg-buildpackage -rfakeroot -b -uc -us -j4 # 编译

5.回到上一级目录,安装编译好的安装包:

1
2
$ cd ..
$ sudo dpkg -i git_2.7.4-0ubuntuxxx_amd64.deb # 安装包名字可能有所不同

执行完成如上步骤后,重新clone,发现依旧报错,请看错误二。

错误二

1
2
3
4
5
6
remote: Counting objects: 10994, done.
remote: Compressing objects: 100% (3085/3085), done.
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

重新确认postBuffer,配置确实生效了:

1
2
3
4
5
$ cat ~/.gitconfig

[http]
sslVerify = false
postBuffer = 2048000000

浅层clone

晕,实在搞不定了,采取极端方法,首先clone一层:

1
$ git clone --depth=1 http://xxx.git

浅层clone成功后,再完整拉取:

1
2
3
$ git fetch --unshallow # 拉取完整当前分支
$ git remote set-branches origin '*' # 追踪所有远程分支
$ git fetch -v # 拉取所有远程分支

至此,终于成功地clone了一个完整的仓库。

]]>
+ + + <p>本文记录工作中遇到的<code>clone</code>大仓库失败的解决过程,以下问题与解决方案均基于<code>https</code>访问。</p> + + + + + + + + +
+ + + 将二进制文件作为目标文件中的一个段 + + https://answerywj.com/2019/07/24/binary-to-object-file/ + 2019-07-24T03:50:23.000Z + 2023-03-20T06:26:35.314Z + + 本文将展示,如何将一个二进制文件(如图片、音频等)作为目标文件中的一个段,该技巧主要应用在一些无文件系统的平台。

本次的实验场景为i386:x86-64 GNU/Linux,测试音频为nhxc.wav,测试程序为bin2obj.c

查看该平台的ELF文件相关信息

生成目标文件

1
$ gcc -c bin2obj.c -o bin2obj.o

查看该平台ELF文件相关信息

1
2
3
4
5
6
7
$ objdump -x bin2obj.o

bin2obj.o: file format elf64-x86-64
bin2obj.o
architecture: i386:x86-64, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x0000000000000000

由上可知,文件格式为elf64-x86-64CPU架构为architecture

转换

首先通过objcopy --help选项查看相关参数的意义:

1
2
3
4
5
6
$ objcopy --help
-I --input-target <bfdname> Assume input file is in format <bfdname>
-O --output-target <bfdname> Create an output file in format <bfdname>
-B --binary-architecture <arch> Set output arch, when input is arch-less
......
objcopy: supported targets: elf64-x86-64 elf32-i386 elf32-iamcu elf32-x86-64 a.out-i386-linux pei-i386 pei-x86-64 elf64-l1om elf64-k1om elf64-little elf64-big elf32-little elf32-big pe-x86-64 pe-bigobj-x86-64 pe-i386 plugin srec symbolsrec verilog tekhex binary ihex

由上可知,-I选项指定输入文件的格式,-O指定输出文件的格式,在supported targets中选择对应的格式;-B是指定目标文件的架构i386:x86-64,即上文objdump -x命令查询的architecture

转换:

1
$ objcopy -I binary -O elf64-x86-64 -B i386:x86-64 nhxc.wav audio.o

查看转换后生成的目标文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ objdump -x audio.o

audio.o: file format elf64-x86-64
audio.o
architecture: i386:x86-64, flags 0x00000010:
HAS_SYMS
start address 0x0000000000000000

Sections:
Idx Name Size VMA LMA File off Algn
0 .data 0000fab0 0000000000000000 0000000000000000 00000040 2**0
CONTENTS, ALLOC, LOAD, DATA
SYMBOL TABLE:
0000000000000000 l d .data0000000000000000 .data
0000000000000000 g .data0000000000000000 _binary_nhxc_wav_start
000000000000fab0 g .data0000000000000000 _binary_nhxc_wav_end
000000000000fab0 g *ABS*0000000000000000 _binary_nhxc_wav_size

可以看到file formatarchitecture信息与bin2obj.o的相同,_binary_nhxc_wav_start指向音频内容的起始地址,_binary_nhxc_wav_end指向音频内容的结尾地址,_binary_nhxc_wav_size指向文件大小的存储地址。

_binary_*_start/end/size*是二进制文件的文件名及后缀名。

测试

bin2obj.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <elf.h>

extern _binary_nhxc_wav_start;
extern _binary_nhxc_wav_end;
extern _binary_nhxc_wav_size;

int main() {
printf("binary to object:\n");

printf("elf head: %ld\n", sizeof(Elf64_Ehdr));
printf("_binary_nhxc_wav_size: %p\n_binary_nhxc_wav_end: %p\n_binary_nhxc_wav_size: %p\n", &_binary_nhxc_wav_start, &_binary_nhxc_wav_end, &_binary_nhxc_wav_size);

unsigned char * audio_buf = (unsigned char *)&_binary_nhxc_wav_start;
unsigned long size = (unsigned long)&_binary_nhxc_wav_size;

FILE *fp = fopen("./out.wav", "wb");
if (!fp) {
fprintf(stderr, "fopen failed!\n");
return -1;
}

fwrite(audio_buf, size, 1, fp);

fclose(fp);

return 0;
}

通过_binary_nhxc_wav_start_binary_nhxc_wav_size两个符号,读取音频文件。

编译并运行:

1
2
3
4
5
6
7
8
$ gcc -c bin2obj.c -o bin2obj.o
$ g++ bin2obj.o audio.o -o bin2obj
$ ./bin2obj
binary to object:
elf head: 64
_binary_nhxc_wav_size: 0x601040
_binary_nhxc_wav_end: 0x610af0
_binary_nhxc_wav_size: 0xfab0

比对写入的文件out.wav与原始文件nhxc.wav,完全一致:

1
2
155e62d81e84fa7493fefe82223bcc2a  nhxc.wav
155e62d81e84fa7493fefe82223bcc2a out.wav

查看audio.o:

1
2
3
4
5
6
$ hexdump -C audio.o | head -n 5
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|
00000010 01 00 3e 00 01 00 00 00 00 00 00 00 00 00 00 00 |..>.............|
00000020 00 00 00 00 00 00 00 00 d0 fb 00 00 00 00 00 00 |................|
00000030 00 00 00 00 40 00 00 00 00 00 40 00 05 00 02 00 |....@.....@.....|
00000040 52 49 46 46 a8 fa 00 00 57 41 56 45 66 6d 74 20 |RIFF....WAVEfmt |

如程序输出,ELF文件头部信息结构体为64字节,而转换生成的目标文件中,音频内容始于0x40字节偏移(wav头始于RIFF,可以参考wav文件解析),而0x40正是十进制的64

Reference

  • 《程序员的自我修养——链接、装载与库》P68
]]>
+ + + <p>本文将展示,如何将一个二进制文件(如图片、音频等)作为目标文件中的一个段,该技巧主要应用在一些无文件系统的平台。</p> + + + + + + + + + + +
+ + + 深究strtok系列函数 + + https://answerywj.com/2019/05/21/man-strtok/ + 2019-05-21T07:59:44.000Z + 2023-03-20T06:26:35.334Z + + 本文通过分析源码,深究GLIBCstrtokstrtok_r函数的实现原理和使用过程中的注意事项。

函数说明

1
2
3
4
#include <string.h>

char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);

说明

  • strtok以包含在delim中的字符为分割符,将str分割成一个个子串;若str为空值NULL,则函数内部保存的静态指针(指向上一次分割位置后一个字节)在下一次调用中将作为起始位置。
  • strtok_r功能同strtok,不过其将strtok函数内部保存的指针显示化,通过saveptr输入,以saveptr作为分割的起始位置。

参数

  • str: 待分割的源字符串
  • delim: 分割符字符集合
  • saveptr: 一个指向char *的指针变量,保存分割时的上下文

返回值

  • 若未提取到子串,返回值为指向源字符串首地址的指针,可以完整打印源字符串
  • 若提取到子串,返回值为提取出的子串的指针,这个指针指向的是子串在源字符串中的起始位置,因为子串末尾的下一个字符在提取前为分割符,提取后被修改成了'/0’,所以可以成功打印子串的内容
  • 若在成功提取到子串后,没有可以被分割的子串,返回NULL

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>

int main(void) {
char str[12] = "hello,world\0";
char *token = strtok(str, ",");

while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, ",");
}

return 0;
}

使用注意事项

不会生成新的字符串,只是在源字符串上做了修改,源字符串会发生变化

1
2
3
4
char str[12] = "hello,world\0";
printf("str before strtok: %s\n", str);
char *token = strtok(str, ",");
printf("str after strtok: %s\n", str);
1
2
$ str before strtok: hello,world
$ str after strtok: hello

如上实验,str的值,在对其做strtok操作之后,发生了变化,分割符之后的内容不见了。事实上,strtok函数是根据输入的分割符(即,),找到其首次出现的位置(即world之前的,),将其修改为'/0’

第一个参数不可为字符串常量

因为strtok函数会修改源字符串,所以第一个参数不可为字符串常量,不然程序会抛出异常。

若在第一次提取子串后,继续对源字符串进行提取,应在其后的调用中将第一个参数置为空值NULL

1
2
3
4
5
6
char str[12] = "hello,world\0";
char *token = strtok(str, ",");
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, ",");
}
1
2
$ hello
$ world

在第一次提取子串时,strtok用一个指针指向了分割符的下一位,即’w’所在的位置,后续的提取给strtok的第一个参数传递了空值NULLstrtok会从上一次调用隐式保存的位置,继续分割字符串。

第二个参数是分割符的集合,支持多个分割符

1
2
3
char str[12] = "hello,world\0";
char *token = strtok(str, ",l");
printf("%s\n", token);
1
$ he

由上可见,strtok函数在分割字符串时,不是完整匹配第二个参数传入的分割符,而是使用包含在分割符集合中的字符进行匹配。

若首字符为分割符,则会被忽略

1
2
3
char str[13] = ",hello,world\0";
char *token = strtok(str, ",");
printf("%s\n", token);
1
$ hello

如上所示,若首字符为分割符,strtok采用了比常规处理更快的方式,直接跳过了首字符。

strtok为不可重入函数,使用strtok_r更灵活和安全

strtok函数在内部使用了静态变量,即用静态指针保存了下一次调用的起始位置,对调用者不可见;strtok_r则将strtok内部隐式保存的指针,以参数的形式由调用者进行传递、保存甚至是修改,使函数更具灵活性和安全性;此外,在windows也有分割字符串安全函数strtok_s

源码

strtok.c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/* Copyright (C) 1991-2018 Free Software Foundation, Inc.
This file is part of the GNU C Library.

The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */

#include <string.h>


/* Parse S into tokens separated by characters in DELIM.
If S is NULL, the last string strtok() was called with is
used. For example:
char s[] = "-abc-=-def";
x = strtok(s, "-");// x = "abc"
x = strtok(NULL, "-=");// x = "def"
x = strtok(NULL, "=");// x = NULL
// s = "abc\0=-def\0"
*/
char *
strtok (char *s, const char *delim)
{
static char *olds;
return __strtok_r (s, delim, &olds);
}

strtok_r.c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/* Reentrant string tokenizer.  Generic version.
Copyright (C) 1991-2018 Free Software Foundation, Inc.
This file is part of the GNU C Library.

The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif

#include <string.h>

#ifndef _LIBC
/* Get specification. */
# include "strtok_r.h"
# define __strtok_r strtok_r
#endif

/* Parse S into tokens separated by characters in DELIM.
If S is NULL, the saved pointer in SAVE_PTR is used as
the next starting point. For example:
char s[] = "-abc-=-def";
char *sp;
x = strtok_r(s, "-", &sp);// x = "abc", sp = "=-def"
x = strtok_r(NULL, "-=", &sp);// x = "def", sp = NULL
x = strtok_r(NULL, "=", &sp);// x = NULL
// s = "abc\0-def\0"
*/
char *
__strtok_r (char *s, const char *delim, char **save_ptr)
{
char *end;

if (s == NULL)
s = *save_ptr;

if (*s == '\0')
{
*save_ptr = s;
return NULL;
}

/* Scan leading delimiters. */
s += strspn (s, delim);
if (*s == '\0')
{
*save_ptr = s;
return NULL;
}

/* Find the end of the token. */
end = s + strcspn (s, delim);
if (*end == '\0')
{
*save_ptr = end;
return s;
}

/* Terminate the token and make *SAVE_PTR point past it. */
*end = '\0';
*save_ptr = end + 1;
return s;
}
#ifdef weak_alias
libc_hidden_def (__strtok_r)
weak_alias (__strtok_r, strtok_r)
#endif

Reference

]]>
+ + + <p>本文通过分析源码,深究<code>GLIBC</code>中<code>strtok</code>和<code>strtok_r</code>函数的实现原理和使用过程中的注意事项。</p> + + + + + + + + + + +
+ + + sysroot为何物? + + https://answerywj.com/2019/04/26/what-is-sysroot/ + 2019-04-26T09:59:57.000Z + 2023-03-20T06:26:35.342Z + + 本文介绍链接过程中sysroot的作用。

sysroot为何物

做过交叉编译的同学们,一定对下面这个错误十分熟悉吧:

1
2
/cross-compiling/ld: cannot find crt1.o: No such file or directory
/cross-compiling/ld: cannot find crti.o: No such file or directory

在我们的pc上,这两个文件一般在/usr/lib或者/usr/lib32中,通过gcc -print-search-dirs可以看到这两个路径默认就在库的搜索路径中,所以在pc上编译程序时不存在链接器找不到crt1.ocrti.o的问题。

crt1.o负责应用程序的启动,其中包含了程序的入口函数_start以及两个未定义的符号__libc_start_mainmain,由_start负责调用__libc_start_main初始化libc,然后调用我们源代码中定义的main函数,crti.o负责辅助启动这些代码。

下面我们使用交叉编译工具链来查看库的搜索路径/cross-compiling/gcc -print-search-dirs,发现crt1.ocrti.o的所在目录并不在库的搜索路径中,所以会出现上述的问题。

下面就需要sysroot出场了。
sysroot被称为逻辑根目录,只在链接过程中起作用,作为交叉编译工具链搜索库文件的根路径,如配置--sysroot=dir,则dir作为逻辑根目录,链接器将在dir/usr/lib中搜索库文件。

只有链接器开启了–with-sysroot选项,–sysroot=director才生效

Reference

]]>
+ + + <p>本文介绍链接过程中<code>sysroot</code>的作用。</p> + + + + + + + + + + +
+ + + 屏蔽静态库接口 + + https://answerywj.com/2019/04/13/hide-symbol-of-static-library/ + 2019-04-13T06:43:13.000Z + 2023-03-20T06:26:35.322Z + + 分享屏蔽静态库接口的一种方法.

准备

hello.c:

1
2
3
4
5
#include <stdio.h>

__attribute__ ((visibility ("default"))) void hello() {
printf("Hello World!\n");
}

hello.h:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef __HELLO__H
#define __HELLO__H

#ifdef __cplusplus
extern "C" {
#endif

void hello();

#ifdef __cplusplus
}
#endif

#endif

bye.c:

1
2
3
4
5
#include <stdio.h>

void bye() {
printf("Bye Bye!\n");
}

bye.h:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef __BYE__H
#define __BYE__H

#ifdef __cplusplus
extern "C" {
#endif

void bye();

#ifdef __cplusplus
}
#endif

#endif

编译

编译时使用-fvisibility=hidden,可以默认将符号隐藏;需要对外的符号使用__attribute__ ((visibility ("default")))修饰即可:

1
2
$ gcc -fvisibility=hidden -I. -c hello.c -o hello.o
$ gcc -fvisibility=hidden -I. -c bye.c -o bye.o

其中hello()未被隐藏,bye()是被隐藏的.

链接

将生成的两个.o文件重定位到libt.o中:

1
$ ld -r hello.o bye.o -o libt.o

去除无用的符号

1
$ strip --strip-unneeded libt.o

隐藏的符号本地化(我也不知道中文怎么翻译了)

1
$ objcopy --localize-hidden libt.o libt_hidden.o

打包成静态库

1
$ ar crv libt.a libt_hidden.o

验证

调用未被隐藏的hello()

test1.c:

1
2
3
4
5
6
#include "hello.h"

int main(void) {
hello();
return 0;
}

编译并运行

1
2
3
$ gcc -I. test1.c -L. -lt -o test
$ ./test
Hello World!

调用隐藏的bye()

test2.c

1
2
3
4
5
6
#include "bye.h"

int main(void) {
bye();
return 0;
}

编译并运行

1
2
3
4
5
$ gcc -I. test2.c -L. -lt -o test
$ ./test
/tmp/ccdaJT7s.o: In function `main':
test2.c:(.text+0xa): undefined reference to `bye'
collect2: error: ld returned 1 exit status
]]>
+ + + <p>分享屏蔽静态库接口的一种方法.</p> + + + + + + + + + + +
+ + + Git速查手册(第二版) + + https://answerywj.com/2019/02/12/git-help-v2/ + 2019-02-12T04:02:40.000Z + 2023-03-20T06:26:35.322Z + + 本文是对之前Git速查手册的更新,增加了一些这段时间使用到的命令。

配置git

笔者使用的是v2.1.0,推荐大家使用v1.8以上的版本。 查看git版本:

1
$ git --version

配置命令git config分为三个级别:

1
2
3
--system : 系统级,位于 /etc/gitconfig .
--global : 用户级,位于 ~/.gitconfig .
--local : 仓库级,位于 repo/.git/config ,default并且优先级最高.

首先需要删除global用户信息,防止不同git软件之间的冲突:

1
2
$ git config --global --unset user.name
$ git config --global --unset user.email

设置用户信息.若同时使用gitlab和github,推荐配置local用户信息:

1
2
$ git config --local user.name "username"
$ git config --local user.email "email"

git支持https和ssh等协议.https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,而ssh支持的原生git协议速度最快。
检查本机SSH公钥:

1
$ ls ~/.ssh

若存在,则将id_rsa.pub添加到github的SSH keys中。若不存在,则生成:

1
$ ssh-keygen -t rsa -C "your_email@youremail.com" 

当ssh配置完成后,再次检查ssh连接情况:

1
2
$ ssh -T git@github.com
Hi! You’ve successfully authenticated, but GitHub does not provide shell access.

若出现上述信息,则表示设置成功。
若使用https访问, 则进行如下配置,并且设置超时时间避免重复输入密码:

1
2
$ git config --global http.sslverify false
$ git config --global credential.helper 'cache --timeout=3600'

设置可视化diff和merge工具, linux系统上推荐使用meld或者diffuse:

1
2
$ git config --global diff.tool meld
$ git config --global merge.tool meld

保存用户名,密码, 避免每次pull/push操作都需要手动输入:

1
2
$ git config --global credential.helper store
# 执行上免的命令后, 下次操作输入的密码会被保存

设置颜色,利于使用:

1
$ git config --global color.ui.true

设置别名:

1
$ git config --global alias checkout co 

上面的命令将checkout设置为别名co

最后,查看一下所有的设置:

1
2
3
$ git config --local --list
$ git config --global --list
$ git config --system --list

工作流

工作流

工作区就是你的本地仓库文件夹,不过其中的.git目录不属于工作区,而是版本库。里面存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
现在来解释一下前面的添加和提交操作:

  1. git add把文件添加进去,实际上就是把文件修改添加到暂存区;
  2. git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
    因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

基本操作

获取远程仓库:

1
$ git clone git@github.com:USERNAME/repo.git

将本地的仓库添加到远程:

1
2
3
$ cd repo
$ git init
$ git remote add origin git@github.com:USERNAME/repo.git

origin就是一个名字,是git为你默认创建的指向这个远程代码库的标签。

添加修改:

1
2
3
$ git add <filename> 
$ git add . # 添加当前目录所有修改过的文件
$ git add * # 递归地添加执行命令时所在的目录中的所有文件

提交修改:

1
2
$ git commit -m "commit message"
$ git commit -am "commit message"

commit message的填写可以参考写好 Git Commit 信息的 7 个建议
am将添加和提交合并为一步,但只对本来就存在的文件有效。

推送修改:

1
$ git push -u origin <feature-branch-name>

-u选项可以将本地分支与远程分支关联,下次git pull操作时可以不带参数.具体参见这里

查看远程仓库:

1
2
3
$ git remote -v
origin git@github.com:USERNAME/repo.git (push)
origin git@github.com:USERNAME/repo.git (fetch)

fork后同步上游仓库的更新:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 第一次需要添加上游仓库
$ git remote add upstream git@github.com:USERNAME/repo.git

$ git remote -v
origin git@github.com:USERNAME/repo.git (push)
origin git@github.com:USERNAME/repo.git (fetch)
upstream git@github.com:USERNAME/repo.git (push)
upstream git@github.com:USERNAME/repo.git (fetch)

$ git fetch upstream
$ git difftool <branch-name> upstream/master
$ git merge upstream/master
$ git mergetool

引用公共代码:
代码引用在git上有两种方式:submodulesubtree,推荐使用subtree方式。

1
2
3
4
5
6
7
8
9
# 第一次初始化
$ git remote add -f <remote-subtree-repository-name> <remote-subtree-repository-url>
$ git subtree add --prefix=<local-subtree-directory> <remote-subtree-repository> <remote-subtree-branch-name> --squash

# 同步subtree的更新
$ git subtree pull --prefix=<local-subtree-directory> <remote-subtree-repository> <remote-subtree-branch-name> --squash

# 推送到远程subtree库
$ git subtree push --prefix=<local-subtree-directory> <remote-subtree-repository> <remote-subtree-branch-name>

使用标签

查看标签 :

1
$ git tag

创建标签 :

1
2
$ git tag -a <tagname> -m "tag message" # 创建标签在当前最新提交的commit上
$ git tag -a <tagname> -m "tag message" <commit id> # 创建标签在指定的commit上

推送标签到远程:

1
2
$ git push origin <tagname> # 推送一个本地标签
$ git push origin --tags # 推送全部未推送过的本地标签

删除标签:

1
2
$ git tag -d <tagname> # 删除一个本地标签;
$ git push origin :refs/tags/<tagname> # 删除一个远程标签。

撤销与回退

查看当前仓库状态:

1
$ git status

查看文件更改:

1
2
$ git difftool <filename>
$ git mergetool <filename>

查看提交历史:

1
2
$ git log
$ git log --pretty=oneline #只保留commit id 和 commit message

撤销工作区Tracked files的修改:

1
$ git checkout -- <filename>

撤销工作区Untracked files的修改:

1
2
3
4
5
6
7
8
9
#####
# n:查看将会删除的文件,防止误删
# f:Untracked的文件
# d:Untracked的目录
# x:包含gitignore的Untracked文件和目录一并删掉,慎用!
#####

git clean -nfd
git clean -fd

回退版本区(git commit)和暂存区(git add),不删除工作空间代码:

1
2
$ git reset --mixed HEAD^ # --mixed为默认参数
$ git reset HEAD^

回退版本区(git commit),暂存区(git add)不回退,不删除工作空间代码:

1
$ git reset --soft HEAD^

回退版本区(git commit)和暂存区(git add),并删除工作空间代码(不包括Untracked files),执行后直接恢复到指定<commit-id>状态:

1
$ git reset --hard <commit-id>

HEAD表示当前版本,HEAD^表示上个版本,HEAD^^表示上上个版本,上100个版本可以表示为HEAD~100以此类推。

回退版本后,若需要返回原来的版本,会发现找不到未来的commit id,则需要查看操作命令历史进行查找:

1
$ git reflog

从版本库删除文件:

1
$ git rm <filename>

若你的代码已经push到线上,则推荐使用下面这个命令回滚:

1
$ git revert <commit-id>

revert是用一次新的commit来回滚之前的commit,更安全;reset则是直接删除指定的commit,若直接push会导致冲突。

分支

查看所有分支,有*标记的是当前分支:

1
$ git branch -a

创建本地分支:

1
$ git branch <newbranch>

创建并切换本地分支:

1
$ git checkout -b <newbranch>

从标签创建分支:

1
2
$ git branch <branch> <tagname>
$ git checkout <branch> # 切换到新建分支

推送新建本地分支到远程:

1
2
3
$ git push -u origin <remote-branch-name>
or
$ git push --set-upstream origin <remote-branch-name>

删除本地分支:

1
$ git branch -d <branch>

若当前分支因为有修改未提交或其它情况不能删除,请使用-D选项强制删除。

删除远程分支(三种方法):

1
2
3
$ git push origin --delete <remote-branch-name>
$ git push origin -d <remote-branch-name>
$ git push origin :<remote-branch-name>

清除无用的分支:

1
$ git remote prune origin

说明:remote上的一个分支被其他人删除后,需要更新本地的分支列表。

获取远程分支到本地已有分支:

1
$ git branch --set-upstream <local-branch> origin/branch

获取远程分支到本地并新建本地分支:

1
$ git checkout -b <local-branch> <remote-branch>

同步当前分支的更新,使用git pull并不保险:

1
2
3
4
5
6
7
8
# 下载最新的代码到远程跟踪分支, 即origin/<branch-name>
$ git fetch origin <branch-name>
# 查看更新内容
$ git difftool <branch-name> origin/<branch-name>
# 尝试合并远程跟踪分支的代码到本地分支
$ git merge origin/<branch-name>
# 借助mergetool解决冲突
$ git mergetool

同步其它分支的更新,本例拉取master分支更新:

1
2
3
4
$ git fetch origin master
$ git difftool <branch-name> origin/master
$ git merge origin/master
$ git mergetool

查看某个<commit id>属于哪个分支:

1
$ git branch -a --contains <commit id>

暂存

当你需要切换分支时,若当前工作区还有些修改没有完成,又不适合提交的,操作切换分支是会提示出错的.这时就需要将这些修改暂存起来:

1
$ git stash save "message"

查看:

1
$ git stash list

恢复:

1
2
3
$ git stash pop [--index] [stash@{num}] 
or
$ git stash apply [--index] [stash@{num}] # 不删除已恢复的进度.

--index表示不仅恢复工作区,还会恢复暂存区;num是你要恢复的操作的序列号,默认恢复最新进度.

删除进度:

1
2
$ git stash drop [stash@{num}] # 删除指定进度
$ git stash clear # 删除所有

清理仓库

清理无用的分支和标签

1
2
3
4
$ git branch -d <branch-name>
$ git tag -d <tag-name>
$ git remote prune origin
$ git pull

清理大文件

  • 查看git相关文件占用空间:

    1
    2
    $ git count-objects -v
    $ du -sh .git
  • 寻找大文件ID

    1
    $ git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10

    输出的第一列是文件ID,第二列表示文件(blob)或目录(tree),第三列是文件大小,此处筛选了最大的10条

  • 获取文件名与ID映射

    1
    $ git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}')"
  • 从所有提交中删除文件

    1
    2
    $ git filter-branch --tree-filter 'rm -rf xxx' HEAD --all
    $ git pull
  • 清理.git目录:

    1
    $ git gc --prune=now

    tips: 在执行push操作时,git会自动执行一次gc操作,不过只有loose object达到一定数量后才会真正调用,建议手动执行。

处理大型二进制文件

由于git在存储二进制文件时效率不高,所以需要借助第三方组件

忽略特殊文件

当你的仓库中有一些文件,类似密码或者数据库文件不需要提交但又必须放在仓库目录下,每次git status都会提示Untracked,看着让人很不爽,提供两种方法解决这个问题

本地

在代码仓库目录创建一个.gitignore文件,编写规则如下:

1
2
3
tmp/  # 忽略tmp文件夹下所有内容
*.ini # 忽略所有ini文件
!data/ #忽略除了data文件夹的所有内容

全局

在用户目录创建一个.gitignore_global文件,编写规则同.gitignore,并修改~/.gitconfig

1
2
[core]
excludesfile = ~/.gitignore_global

如果添加的忽略对象已经Tracked,纳入了版本管理中,则需要在代码仓库中先把本地缓存删除,改变成Untracked状态

1
$ git rm -r --cached .

.gitignore模版

奇技淫巧

重写历史(慎用!)

1
$ git rebase -i [git-hash| head~n]

其中git-hash是你要开始进行rebasecommithash,而head~n则是从HEAD向前推ncommit

全局更换电子邮件

1
2
3
4
5
6
7
8
9
git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_EMAIL" = "xxx@localhost" ];
then
GIT_AUTHOR_NAME="xxx";
GIT_AUTHOR_EMAIL="xxx@example.com";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD --all

帮助

查看帮助:

1
$ git --help

Reference

  1. 廖雪峰老师的git教程
  2. 常用Git命令清单
  3. Git-Book
  4. Git-Reference
  5. Git push与pull的默认行为
  6. git stash 详解
]]>
+ + + <p>本文是对之前<a href="http://answerywj.com/2016/08/28/Git%E9%80%9F%E6%9F%A5%E6%89%8B%E5%86%8C/">Git速查手册</a>的更新,增加了一些这段时间使用到的命令。</p> + + + + + + + + +
+ + + C代码覆盖率测试工具Gcov + + https://answerywj.com/2018/09/25/coverage-of-code/ + 2018-09-25T10:48:49.000Z + 2023-03-20T06:26:35.314Z + + 代码覆盖率测试反映了测试的广度与深度,量化了测试和开发质量,是十分有必要的,业界目前有针对各种语言的覆盖率测试工具,本文主要介绍C/C++相关的覆盖率测试工具Gcov

介绍

简介

Gcov是一个测试覆盖程序,是集成在GCC中的,随GCC一起发布

基本概念

基本块BB

基本块指一段程序的第一条语句被执行过一次后,这段程序中的每一跳语句都需要执行一次,称为基本块,因此基本块中的所有语句的执行次数是相同的,一般由多个顺序执行语句后边跟一个跳转语句组成

跳转ARC

从一个BB到另外一个BB的跳转叫做一个ARC,要想知道程序中的每个语句和分支的执行次数,就必须知道每个BBARC的执行次数

程序流图

如果把BB作为一个节点,这样一个函数中的所有BB就构成了一个有向图,要想知道程序中的每个语句和分支的执行次数,就必须知道每个BBARC的执行次数,根据图论可以知道有向图中BB的入度和出度是相同的,所以只要知道了部分的BB或者ARC大小,就可以推断所有的大小,这里选择由ARC的执行次数来推断BB的执行次数,所以对部分ARC插桩,只要满足可以统计出来所有的BBARC的执行次数即可

原理

测试程序首先进行编译预处理,生成汇编文件,并完成插桩,插桩的过程中会向源文件的末尾插入一个静态数组,数组的大小就是这个源文件中桩点的个数,数组的值就是桩点的执行次数,每个桩点插入3~4条汇编语句,直接插入生成的*.s文件中,最后汇编文件经过汇编生成目标文件,在程序运行过程中桩点负责收集程序的执行信息

使用

编译

测试代码如下:
say.c:

1
2
3
4
5
6
#include <stdio.h>

int say(char *what) {
printf("------ %s\n", what);
return 0;
}

main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

extern int say(const char *);

int main(int argc, const char *argv[]) {

if (argv[1]) {
say("hello");
} else {
say("bye");
}
return 0;
}

添加-fprofile-arcs -ftest-coverage -fPIC编译参数编译程序,生成可执行程序和*.gcno文件,里面记录了行信息和程序流图信息:

1
2
3
4
$ gcc -fprofile-arcs -ftest-coverage -fPIC -O0 say.c main.c

$ ls
a.out main.c main.gcno say.c say.gcno

数据收集

运行可执行文件,生成*.gcda在默认生成在相应*.o文件目录,里面记录了*.c文件中程序的执行情况,包括跳变次数等:

1
2
3
4
5
$ ./a.out
------ bye

$ ls
a.out main.c main.gcda main.gcno say.c say.gcda say.gcno

可以通过设置环境变量GCOV_PREFIX=/xxx/xxxGCOV_PREFIX_STRIP=x来改变路径,其中GCOV_PREFIX_STRIP表示去掉源代码路径中的前几级,默认为0,比如源代码路径为/a/b/c/d.cGCOV_PREFIX_STRIP=2,则实际使用的路径是c/d.c,如果GCOV_PREFIX=/e/f,则.gcda实际存放的路径是/e/f/c/d.gcda

报告生成

针对某一个文件的执行情况,可以通过如下命令生成报告,并创建*.gcov文件:

1
2
3
4
$ gcov -a main.c
File 'main.c'
Lines executed:80.00% of 5
Creating 'main.c.gcov'

常用选项,更多可参考Invoking gcov

1
2
3
-b:分支覆盖
-a:所有基本块覆盖
-f:函数覆盖

注意事项

  1. 在编译时不要加优化选项,否则代码会发生变化,无法准确定位
  2. 代码中复杂的宏,比如宏展开后是循环或者其他控制结构,可以用内联函数来代替,因为gcov只统计宏调用出现的那一行
  3. 代码每一行最好只有一条语句
  4. *.gcno*.gcda需要匹配,两个文件是有时间戳来记录是不是匹配的
  5. 若是编译动态库,需要在链接时-lgcov

图形化展示

gcov生成的报告分散在各个源码文件所对应的*.gcov文件中,难以汇总分析,并且可视化效果较差,所以需要转化成可视图形化报告,有lcovgcovr两个工具可以完成,两者功能基本相同,本文主要介绍gcovr,是一个用Python编写的开源软件,大小只有几十KB,安装参见官网

列表形式

  1. 代码覆盖率

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ gcovr -r .
    ------------------------------------------------------------------------------
    GCC Code Coverage Report
    Directory: .
    ------------------------------------------------------------------------------
    File Lines Exec Cover Missing
    ------------------------------------------------------------------------------
    main.c 5 4 80% 15
    say.c 3 3 100%
    ------------------------------------------------------------------------------
    TOTAL 8 7 87%
    ------------------------------------------------------------------------------

    报告展示程序运行后覆盖了80%的代码

  2. 分支覆盖率

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ gcovr -b -r .
    ------------------------------------------------------------------------------
    GCC Code Coverage Report
    Directory: .
    ------------------------------------------------------------------------------
    File Branches Taken Cover Missing
    ------------------------------------------------------------------------------
    main.c 2 1 50% 14
    say.c 0 0 --%
    ------------------------------------------------------------------------------
    TOTAL 2 1 50%
    ------------------------------------------------------------------------------

    报告展示了在main.c中有一个分支没有执行到

XML文件形式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$ gcovr --xml-pretty -r .
<?xml version="1.0" ?>
<!DOCTYPE coverage
SYSTEM 'http://cobertura.sourceforge.net/xml/coverage-04.dtd'>
<coverage branch-rate="0.5" branches-covered="1" branches-valid="2"
complexity="0.0" line-rate="0.875" lines-covered="7" lines-valid="8"
timestamp="1537930892" version="gcovr 3.4">
<sources>
<source>.</source>
</sources>
<packages>
<package branch-rate="0.5" complexity="0.0" line-rate="0.875" name="">
<classes>
<class branch-rate="0.5" complexity="0.0" filename="main.c"
line-rate="0.8" name="main_c">
<methods/>
<lines>
<line branch="false" hits="1" number="12"/>
<line branch="true" condition-coverage="50% (1/2)" hits="1" number="14">
<conditions>
<condition coverage="50%" number="0" type="jump"/>
</conditions>
</line>
<line branch="false" hits="0" number="15"/>
<line branch="false" hits="1" number="17"/>
<line branch="false" hits="1" number="19"/>
</lines>
</class>
<class branch-rate="0.0" complexity="0.0" filename="say.c" line-rate="1.0"
name="say_c">
<methods/>
<lines>
<line branch="false" hits="1" number="10"/>
<line branch="false" hits="1" number="11"/>
<line branch="false" hits="1" number="12"/>
</lines>
</class>
</classes>
</package>
</packages>
</coverage>

HTML文件形式

1
2
3
$ gcovr -r . --html -o xxx.html
$ ls
a.out main.c main.gcda main.gcno say.c say.gcda say.gcno xxx.html

可以发现添加--html参数后,可以生成html文件,用浏览器打开,如下图:
gcovr_xxx.png

还可以添加--html-details选项,为每个代码文件单独生成html

1
2
3
$ gcovr -r . --html --html-details -o xxx.html
$ ls
a.out main.c main.gcda main.gcno say.c say.gcda say.gcno xxx.html xxx.main.c.html xxx.say.c.html

可以发现多了xxx.main.c.htmlxxx.say.c.html,用浏览器打开xxx.html,如下图:
gcovr_xxx_detail.png
文件名较之前带上了下划线,单击文件名,可以看到具体的代码覆盖情况,如下图:
gcovr_xxx_main.png

其它

其它功能,如Filters等,可以参考官方文档

Reference

]]>
+ + + <p>代码覆盖率测试反映了测试的广度与深度,量化了测试和开发质量,是十分有必要的,业界目前有针对各种语言的覆盖率测试工具,本文主要介绍<code>C/C++</code>相关的覆盖率测试工具<code>Gcov</code></p> + + + + + + + + +
+ + + cJSON的秘密 + + https://answerywj.com/2018/05/03/cjson/ + 2018-05-03T08:58:02.000Z + 2023-03-20T06:26:35.314Z + + 学习使用cJSON过程的一些发现和总结,不涉及具体的函数

cJSON简介

cJSON是一个快速,高性能的json解析器,由C语言编写,仅包含cJSON.ccJSON.h两个文件,不支持跨平台;跨平台推荐纯lua写的dkjson

cJSON结构体

cJSON结构体的组成:

1
2
3
4
5
6
7
8
9
10
11
12
typedef struct cJSON {
struct cJSON *next, *prev;
struct cJSON *child;

int type;

char *valuestring;
int valueint;
double valuedouble;

char *string;
} cJSON;

其中

  • next指向链表中下一个兄弟节点,prev指向本节点前一个节点
  • child节点只有对象和数组有,并且child节点是双向链表的头节点,childprev一般为NULL,不指向任何节点,双向链表的最后一个兄弟节点的next是无指向的
  • type取值有Null/True/False/Number/String/Array/Object,这些值类型都在cJSON.h中通过宏定义了
  • String类型节点有valuestring Number类型节点有valueintvaluedouble
  • string表示节点的名称,所有的节点都是一个链表,都具有string

cJSON默认所有值都为0,除非额外为其赋有意义的值

cJSON树结构

cJSON使用树结构存储JSON的各个节点,而这个树结构是使用双向链表实现的(实线表示节点间有真实的引用关系,而虚线表示逻辑上的引用关系):
cJSON树结构

  • 树结构的每一层都是一个双向链表,表示一堆兄弟节点
  • 当前层的所有节点都是当前链表头节点的父节点的子节点

下面举例说明:

1
2
3
4
5
6
7
8
9
10
{
"name": "Jack (\"Bee\") Nimble",
"format": {
"type": "rect",
"width": 1920,
"height": 1080,
"interlace": false,
"frame rate": 24
}
}
  • nameformat节点组成一个链表,typewidthheightinterlaceframe rate节点组成一个链表
  • 根节点包含节点类型Object和子节点name
  • 子节点包含节点名称name、节点值Jack ("Bee") Nimble和兄弟节点format
  • format节点包含节点类型Object、节点名称format和子节点type
  • type节点包含节点类型String、节点名称type、节点值rect和兄弟节点width
  • width节点包含节点类型Number、节点名称width、节点值1920和兄弟节点height
  • height节点包含节点类型Number、节点名称height、节点值1080和兄弟节点interlace
  • interlace节点包含节点类型False、节点名称interlace和兄弟节点frame rate
  • frame rate节点包含节点类型Number、节点名称frame tate和节点值25

cJSON内存管理

cJson分为自动和手动两种使用方式:

  • 在自动模式下,cJSON使用默认的mallocfree函数管理内存,在cJSON中,每个节点都是malloc而来,每个节点的stringvaluestring也是malloc而来,使用cJSON_Delete函数可以递归释放JSON树中malloc的节点内存和字符内存,使用cJSON_Print函数后,则需要手动释放cJSON_Print函数分配的内存,避免内存泄露
  • 在手动模式下,cJSON提供了钩子函数来帮助用户自定义内存管理函数,如果不设置,这默认为mallocfree
1
2
struct cJSON_Hooks js_hook = {xxx_malloc, xxx_free};
cJSON_InitHooks(&js_hook);

cJSON序列化

cJSON序列化就是把cJSON输出,有两种形式:

  • 格式化输出char *cJSON_Print(cJSON *item);
  • 压缩输出char *cJSON_PrintUnformatted(cJSON *item);

需要注意的是cJSON采用了预先将要输的内容全部以字符串形式存储在内存中,最后输出整个字符串的方法,而不是边分析json数据边输出,所以对于比较大的json数据来说,内存就是个问题了

Reference

]]>
+ + + <p>学习使用cJSON过程的一些发现和总结,不涉及具体的函数</p> + + + + + + + + +
+ + + Linux下core文件使用 + + https://answerywj.com/2018/03/07/usage-of-core-in-linux/ + 2018-03-07T08:16:15.000Z + 2023-03-20T06:26:35.342Z + + 有时候程序会异常退出而不带任何日志,此时就可以使用core文件进行分析,它会记录程序运行的内存,寄存器,堆栈指针等信息

什么是core文件

通常在Linux下遇到程序异常退出或者中止,我们都会使用core文件进行分析,其中包含了程序运行时的内存,寄存器,堆栈指针等信息,格式为ELF,可以理解是程序工作当前状态转储成一个文件,通过工具分析这个文件,我们可以定位到程序异常退出或者终止时相应的堆栈调用等信息,为解决问题提供帮助。

使用core文件调试

生成方法

  1. 查看当前core文件的状态

    1
    2
    3
    4
    $ ulimit -a
    ...
    -c: core file size (blocks) 0 # 关闭状态
    ...
  2. 打开生成开关

    1
    2
    3
    4
    5
    ulimit -c unlimited
    ulimit -a
    ...
    -c: core file size (blocks) unlimited
    ...
  3. core文件的大小进行限制,单位为blocks,一般1 block=512 bytes,设置太小可能导致不会生成文件

    1
    2
    3
    4
    5
    $ ulimit -c 1024
    $ ulimit -a
    ...
    -c: core file size (blocks) 1024
    ...
  4. 关闭生成开关

    1
    2
    3
    4
    5
    ulimit -c 0
    ulimit -a
    ...
    -c: core file size (blocks) 0
    ...

上面对core文件的操作仅对当前生效,若需要永久生效,则要将相应操作写入/etc/profile

生成路径

core文件默认生成在程序的工作目录,可以对生成路径进行设置,需要保证对对应目录有足够空间并具有写权限

1
echo /MyCoreDumpDir/core.%e.%p > /proc/sys/kernel/core_pattern

其中命名使用的参数列表

1
2
3
4
5
6
7
%p - insert pid into filename  # 添加 pid 
%u - insert current uid into filename # 添加当前 uid
%g - insert current gid into filename # 添加当前 gid
%s - insert signal that caused the coredump into the filename # 添加导致产生 core 的信号
%t - insert UNIX time that the coredump occurred into filename # 添加 core 文件生成时的 unix 时间
%h - insert hostname where the coredump happened into filename # 添加主机名
%e - insert coredumping executable name into filename # 添加命令名

/proc/sys/kernel/core_uses_pid这个文件的值若为1,则无论是否配置%p,最后生成的core文件都会添加pid

调试方法

可以使用gdbcore文件进行调试,编译时需要带上-g选项

1
2
3
4
5
6
$ gdb a.out
...
(gdb) core-file core
...
(gdb) bt
...

如需要在PC上调试嵌入式设备产生的core文件,则需要选取相应平台的gdb工具,并在进入gdb后设置符号文件的位置

1
2
3
4
5
6
7
8
$ xxx-xxx-gdb a.out
...
(gdb) solib-search-path xxx.so:xxx.so
...
(gdb) core-file core
...
(gdb) bt
...
]]>
+ + + <p>有时候程序会异常退出而不带任何日志,此时就可以使用<code>core</code>文件进行分析,它会记录程序运行的内存,寄存器,堆栈指针等信息</p> + + + + + + + + +
+ + + Speex介绍 + + https://answerywj.com/2017/12/29/speex/ + 2017-12-29T07:49:34.000Z + 2023-03-20T06:26:35.338Z + + 本文将对Speex相关的概念进行介绍

[TOC]

Speex编解码器是一款开源且免费的语音编解码器,遵循BSD协议,为分封网络(packet network)和网络电话(VoIP)而设计,支持文件的压缩

为网络电话而不是移动电话而设计,意味着Speex对数据丢失具有鲁棒性,但是对数据包损坏不鲁棒,在VoIP中的数据包要么完整到达,要么不能到达

Speex选用CELP(码激励线性预测编码)编码技术,在高比特率和低比特率都稳定可靠,复杂性适度并且占用内存较少

相关概念

采样率

采样率是每秒钟采集到的信号样本数,单位是HertzHz),Speex为三种不同的采样率而设计:8kHz(窄带),16kHz(宽带)和32kHz(超宽带)

比特率

在对语音信号编码时,比特率定义为单位时间内的比特数,单位是比特每秒(bps)或通常的千比特每秒(kbps

注意千比特每秒(kbps)和千字节每秒(kBps)的区别。

质量(可变)

Speex是有损的编解码器,意味着压缩率以输入语音信号的保真度为代价,质量越高,压缩后的比特率越大,音质也越好
Speex可以控制质量和比特率之间的折中,大多数时间由一个范围在010之间的质量参数控制

在不变比特率(CBR)中,质量参数是一个整数; 在可变比特率(VBR)中,质量参数是一个浮点数。

复杂度(可变)

Speex允许编码器拥有可变的复杂度,通过一个范围在110之间的整数控制搜索的执行来实现,复杂度越高,压缩率越高,CPU使用率越高,音质越好,类似于gzipbzip2压缩工具的-1到*-9选项
正常使用情况下,复杂度为
1的噪声等级比复杂度为10的噪声等级高12dB,但复杂度为10CPU要求比复杂度为1的高5*倍。

实际应用中,最好的折中是复杂度24,但在编码非语音声音如DTMF声调时更高的复杂度经常被用到

可变比特率(VBR

可变比特率(VBR)允许编解码器自适应的根据待编码音频的“难度”动态地改变比特率,如元音和高能瞬态变化的声音需要高比特率以获得好的质量; 但是摩擦音(如s,f)用低比特率就能充分编码

  • 优点:VBR在相同的质量下能获得更低的比特率,或在不变比特率下获得更好的质量
  • 缺点:在指定质量情况下,无法保证最终的平均比特率;在一些如网络电话(VoIP)这样的实时应用中,依赖于最大比特率,这在通信信道中必须足够低。

平均比特率(ABR

平均比特率解决了VBR中的一个问题,它动态地调整VBR质量以获得指定的比特率,因为质量和比特率是实时调整的,ABR的全局质量比正好达到目标平均比特率的VBR编码质量稍微差些。

声音活动检测(VAD

VAD检测待编码的音频是语音还是无声/背景噪声,VBR编码中默认激活

Speex检测出非语言段并仅使用足够复现背景噪声的比特率进行编码,这叫“柔化噪音生成”(CNG)。

断续传输(DTX)

断续传输是VAD/VBR的附加操作,当背景噪声平稳时会完全停止传输

知觉增强

知觉增强是解码器的一部分,当被启用时,能减少编解码过程中产生的噪声或失真的知觉

在大多数情况下,知觉增强会带来声音客观上的偏离(如仅考虑SNR),但最后仍听起来更好(主管增强)

等待时间和算法延时

每一个语音编解码器在传输中都会引入延时,对于Speex,延时等于帧长加上处理每一帧需要前几帧的数量

在窄带操作中延时为30ms,在宽带操作中延时为34ms,这不包括编解码帧时的CPU时间

相关组件

编解码器

Speex编解码器有以下特性

  1. 免费软件/开源,免专利费和版税
  2. 利用嵌入比特流集成了窄带和宽带
  3. 大范围可用比特率(从2.15kbps44kbps
  4. 动态比特率转换(AMR)和可变比特率操作(VBR
  5. 声音活动检测(VAD,与VBR集成)和断续传输(DTX
  6. 可变复杂度
  7. 嵌入宽带结构(可伸缩采样率)
  8. 32kHz超宽带采样率
  9. 强度立体声编码选项
  10. 定点实现

预处理器

预处理器在对音频编码前对音频进行预处理,有三个主要功能

  1. 噪声抑制
    先降噪再进行编解码是有好处的,因为Speex编解码器通常会对噪声输入同样进行编解码,这将会扩大噪声,而降噪能大大减少这一影响
  2. 自动增益控制(AGC
    自动增益控制(AGC)是为了处理录音音量在不同设置里有很大差别这一问题,AGC将会调整信号音量到参考音量大小
  3. 声音活动检测(VAD
    预处理器提供的声音活动检测(VAD)比编解码器中直接提供的VAD更先进

自适应抖动缓冲器

当通过UDPUser Datagram Protocal,用户数据报协议)或RTPReal Time Protocal,实时传输协议)传输声音(或其他任何内容)时,数据包可能丢失,不同延时到达,甚至乱序,抖动缓冲器的作用是对数据包进行重排序并保存在足够长的buffer(但有一定限度)里,然后将数据包发送去解码

声学回声消除器

在任何免提式通信系统中(下图),远端的语音在本地扬声器播放时,经过在房间里传播后又会被麦克风录音,如果将麦克风录音直接又发送到远端,则远端的用户将会听到他自己的回声
aec
声学回声消除器就是为了在将录音发送到远端前消除声学回声,提高了远端接收的语音质量

重采样器

重采样指转换音频的采样率,在任意采样率间进行转换(采样率必须是有理数),能控制质量和复杂度的折中,可用于能混合不同采样率流,支持声卡不支持的采样率,能转码等

Reference

]]>
+ + + <p>本文将对<em>Speex</em>相关的概念进行介绍</p> + + + + + + + + +
+ + + 线程同步机制条件变量的使用与思考 + + https://answerywj.com/2017/12/15/condition-variables-of-thread-synchronization/ + 2017-12-15T14:23:08.000Z + 2023-03-20T06:26:35.314Z + + 条件变量是Linux线程同步的一种机制,与互斥量一起使用时,允许线程以无竞争的方式等待特定条件的发生

[TOC]

关键函数

初始化与注销

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <pthread.h>

// 静态初始化
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

// 动态初始化
int pthread_cond_init(thread_cond_t *cond,
const pthread_condattr_t *attr);

// 反初始化,即注销
int pthread_cond_destroy(pthread_cond_t *cond);

返回值: 若成功,返回0;否则,返回错误编码

注意:

  • 只有在没有线程在该条件变量上等待时,才可以注销条件变量,否则会返回EBUSY
  • Linux在实现条件变量时,并没有为条件变量分配资源,所以在注销一个条件变量时,只需要注意该变量是否仍有等待线程即可

线程等待

1
2
3
4
5
6
7
8
9
10
#include <pthread.h>

int pthread_cond_wait(pthread_cond_t *cond,
pthread_mutex_t *mutex);

int pthread_cond_timedwait(pthread_cond_t *cond,
pthread_mutex_t *mutex,
const struct timespec *abstime);

返回值: 若成功,返回0;否则,返回错误编码

执行过程如下:

  1. 调用者把锁住的互斥量传给函数,然后函数自动把调用线程放到等待条件的线程列表上
  2. 对互斥量进行解锁,线程挂起进入等待(不占用CPU时间) 
  3. 函数被唤醒返回时,会自动对互斥量进行加锁

pthread_cond_timedwait只是多了一个等待超时时间,通过timespec指定,超时返回错误ETIMEDOUT

线程唤醒

1
2
3
4
5
6
7
#include <pthread.h>

int pthread_cond_signal(pthread_cond_t *cond);

int pthread_cond_broadcast(pthread_cond_t *cond);

返回值: 若成功,返回0;否则,返回错误编码
  • pthread_cond_signal至少能唤醒一个等待该条件的线程
  • pthread_cond_broadcast则能唤醒等待该条件的所有线程

    需要注意的是,一定要在改变条件状态以后再给线程发信号

示例

示例代码可参考我的github,由于篇幅原因,不在此贴出

一些思考

条件变量实质是什么

条件变量实质是利用线程间共享的全局变量进行同步的一种机制

互斥量保护的是什么

示例中的相关代码

1
2
3
4
5
6
7
8
pthread_mutex_lock(&(test->mut));

while (test->condition == 0)
{
pthread_cond_wait(&(test->cond), &(test->mut));
}

pthread_mutex_unlock(&(test->mut));

互斥量是用来保护条件test->condition在读取时,它的值不被其它线程修改,如果条件成立,则此线程进入等待条件的线程队列,对互斥量进行解锁并开始等待

为什么用while来判断条件

如上面的代码所示,使用while对条件进行判断的原因如下:

  1. 若先解锁互斥量,再唤醒等待线程,则条件可能被其它线程更改,使得等待条件再次成立,需要继续等待
  2. pthread_cond_wait可能存在意外返回的情况,则此时条件并没有被更改,需要继续等待。

    造成意外返回的原因是Linux中带阻塞功能的系统调用都会在进程收到signal后返回

先唤醒线程还是先解锁

示例代码:

  1. 情况一:先唤醒

    1
    2
    3
    4
    pthread_mutex_lock(&(test->mut));
    test->condition = 1
    pthread_cond_signal(&(test->cond));
    pthread_mutex_unlock(&(test->mut));
  2. 情况二:先解锁

    1
    2
    3
    4
    pthread_mutex_lock(&(test->mut));
    test->condition = 1
    pthread_mutex_unlock(&(test->mut));
    pthread_cond_signal(&(test->cond));

    两种情况各有缺点:

  • 情况一在唤醒等待线程后,再解锁,使得等待线程在被唤醒后试图对互斥量进行加锁时,互斥量还未解锁,则线程又进入睡眠,待互斥量解锁成功后,再次被唤醒并对互斥量加锁,这样就会发生两次上下文切换,影响性能
  • 情况二在唤醒等待线程前先解锁,使得其它线程可能先于等待线程获取互斥量,并对条件进行更改,使得条件变量失去作用

Reference

]]>
+ + + <p>条件变量是<em>Linux</em>线程同步的一种机制,与互斥量一起使用时,允许线程以无竞争的方式等待特定条件的发生</p> + + + + + + + + +
+ +
diff --git a/avatar/Misaka.jpg b/avatar/Misaka.jpg new file mode 100644 index 000000000..42b4d6c77 Binary files /dev/null and b/avatar/Misaka.jpg differ diff --git a/categories/C-C/index.html b/categories/C-C/index.html new file mode 100644 index 000000000..5f5589499 --- /dev/null +++ b/categories/C-C/index.html @@ -0,0 +1,2358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + + + + + + +
+ + + inline使用注意事项 + +
+

GCC在不优化时不会内联任何函数,除非指定函数的“always_inline”属性。

+
+ + + +
+
+ + + + + + + + +
+ + + getrusage-进程资源统计函数 + +
+

getrusage用于统计系统资源使用情况,即进程执行直到调用该函数时的资源使用情况,如果在不同的时间调用该函数,会得到不同的结果。

+
+ + + +
+
+ + + + + + + + +
+ + + 深究strtok系列函数 + +
+

本文通过分析源码,深究GLIBCstrtokstrtok_r函数的实现原理和使用过程中的注意事项。

+
+ + + +
+
+ + + + + + + + +
+ + + C代码覆盖率测试工具Gcov + +
+

代码覆盖率测试反映了测试的广度与深度,量化了测试和开发质量,是十分有必要的,业界目前有针对各种语言的覆盖率测试工具,本文主要介绍C/C++相关的覆盖率测试工具Gcov

+
+ + + +
+
+ + + + + + + + +
+ + + cJSON的秘密 + +
+

学习使用cJSON过程的一些发现和总结,不涉及具体的函数

+
+ + + +
+
+ + + + + + + + +
+ + + Linux下core文件使用 + +
+

有时候程序会异常退出而不带任何日志,此时就可以使用core文件进行分析,它会记录程序运行的内存,寄存器,堆栈指针等信息

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/categories/C-C/page/2/index.html b/categories/C-C/page/2/index.html new file mode 100644 index 000000000..7266380c3 --- /dev/null +++ b/categories/C-C/page/2/index.html @@ -0,0 +1,2162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + 从文件流中读写整数--C语言 + +
+

本文将介绍在文本流中,读写整数的两个接口– int getw(FILE *fp)int putw(int w, FILE *fp),并且与你分享改进后的更实用的接口– unsigned int get_uint(FILE *fp)unsigned int put_uint(unsigned int i,FILE *fp).

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + + UNIX编程安全读写函数 + +
+

字节流套接字(TCP套接字)上的read和write函数所表现的行为不同于通常的文件I/O。字节流套接字调用read或write输入或输出的字节数可能比请求的数量少,然而这并不是出错的状态。这是因为内核中用于套接字的缓冲区可能达到了极限。通常这种情况出现在一次读多于4096个字节或write在非阻塞情况下返回不足字节数。为了不多次调用read或防止write返回不足字节数,我们用下面的两个函数来替代read和write。

+
+ + + +
+
+ + + + + + + + +
+ + + C语言生成随机数 + +
+

本文将介绍C语言生成随机数的方法,主要使用 rand() 函数和 srand() 函数.

+
+ + + +
+
+ + + + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/categories/Git/index.html b/categories/Git/index.html new file mode 100644 index 000000000..a6438543c --- /dev/null +++ b/categories/Git/index.html @@ -0,0 +1,2008 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/categories/Lua/index.html b/categories/Lua/index.html new file mode 100644 index 000000000..4e92f4804 --- /dev/null +++ b/categories/Lua/index.html @@ -0,0 +1,1960 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/categories/Shell\350\204\232\346\234\254/index.html" "b/categories/Shell\350\204\232\346\234\254/index.html" new file mode 100644 index 000000000..36167ce62 --- /dev/null +++ "b/categories/Shell\350\204\232\346\234\254/index.html" @@ -0,0 +1,2056 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + Shell脚本浮点运算 + +
+

本文将介绍几种Linux下通过Shell脚本进行浮点数计算的方法。

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + +
+ + + Linux Shell 脚本调试总结 + +
+

Shell脚本是用户与Linux操作系统交互的一种方式,在脚本编程过程中自然少不了进行调试工作,本文将介绍三种常用的调试方法.(默认使用bash shell)

+
+ + + +
+
+ + + + + + + + +
+ + + Linux fork炸弹解析 + +
+

**:(){ :|: & };:**是一个bash函数,以Fork Bomb闻名,是一个拒绝服务攻击 的Linux 系统。如果你好奇地去执行了这个命令,那么赶快重启系统吧~!

+
+ + + +
+
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/categories/index.html b/categories/index.html new file mode 100644 index 000000000..c1f94d3db --- /dev/null +++ b/categories/index.html @@ -0,0 +1,1889 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + 分类 · AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+
+ +
+ + +
+

原文作者:AnSwErYWJ +

原文链接:https://answerywj.com/categories/ +

发表日期:2016/07/10 13:07

+

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

+
+ + +
    + + +
+ + + + + + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/categories/\345\215\232\345\256\242\345\273\272\347\253\231/index.html" "b/categories/\345\215\232\345\256\242\345\273\272\347\253\231/index.html" new file mode 100644 index 000000000..878f19db1 --- /dev/null +++ "b/categories/\345\215\232\345\256\242\345\273\272\347\253\231/index.html" @@ -0,0 +1,1916 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + Hexo+Github博客备份方法 + +
+

使用hexo+github搭建的博客,博客作为一个单独的github仓库存在,可是仓库中不包含你每篇博客的源文件。如果你换了一台机器想要更新博客或者想重新发布以前的博客,这就不好办了。我这里推荐一种云端备份的方法。

+
+ + + +
+
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/categories/\347\247\221\346\231\256/index.html" "b/categories/\347\247\221\346\231\256/index.html" new file mode 100644 index 000000000..a67e6bc9d --- /dev/null +++ "b/categories/\347\247\221\346\231\256/index.html" @@ -0,0 +1,2060 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + + + + + + +
+ + + UNIX下IO模型分析 + +
+

UNIX下的五种常见IO模型分析,帮助理解

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + +
+ + + 科普|3.5mm耳机国标和美标 + +
+

现在3.5mm规格的耳机已经普遍使用,但是用户会发现一些国外厂家的耳机并不适用国产手机,下面就为大家科普一下,解开这个迷题。

+
+ + + +
+
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/categories/\347\263\273\347\273\237\351\205\215\347\275\256/index.html" "b/categories/\347\263\273\347\273\237\351\205\215\347\275\256/index.html" new file mode 100644 index 000000000..b372fb022 --- /dev/null +++ "b/categories/\347\263\273\347\273\237\351\205\215\347\275\256/index.html" @@ -0,0 +1,2060 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + Homebrew + +
+

本文将介绍Homebrew的安装与使用。

+
+ + + +
+
+ + + + + + + + +
+ + + Linux下处理json数据 + +
+

当我们在Linux下需要处理json数据时,第一反应是用脚本编写一个工具,这样即耗时又不通用. 本文将介绍专门的命令行json处理工具jq.

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/categories/\347\274\226\350\257\221\351\223\276\346\216\245/index.html" "b/categories/\347\274\226\350\257\221\351\223\276\346\216\245/index.html" new file mode 100644 index 000000000..dd4124b68 --- /dev/null +++ "b/categories/\347\274\226\350\257\221\351\223\276\346\216\245/index.html" @@ -0,0 +1,2262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + RPATH与RUNPATH的区别 + +
+

本文从一个实际遇到的问题出发,分析 RPATHRUNPATH 的区别,以及产生的原因。

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + + sysroot为何物? + +
+

本文介绍链接过程中sysroot的作用。

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + +
+ + + GCC编译ARM篇 + +
+

ARM 平台下GCC编译相关介绍,待补充

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/categories/\350\257\255\351\237\263/index.html" "b/categories/\350\257\255\351\237\263/index.html" new file mode 100644 index 000000000..295753cfe --- /dev/null +++ "b/categories/\350\257\255\351\237\263/index.html" @@ -0,0 +1,1962 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + +
+
+
+ +

+ + +

+ +

+ + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + + + + + + +
+ + + Speex介绍 + +
+

本文将对Speex相关的概念进行介绍

+
+ + + +
+
+ + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content.json b/content.json new file mode 100644 index 000000000..ed9ab5095 --- /dev/null +++ b/content.json @@ -0,0 +1 @@ +{"meta":{"title":"AnSwErYWJ's Blog","subtitle":"Sharing is a virtue","description":"分享C/C++,嵌入式开发,人工智能等技术知识","author":"AnSwErYWJ","url":"https://answerywj.com","root":"/"},"posts":[{"title":"Linux下core文件的生成和使用","date":"2022-12-20T09:17:11.000Z","path":"2022/12/20/generate-and-usage-of-core-in-linux/","permalink":"https://answerywj.com/2022/12/20/generate-and-usage-of-core-in-linux/","categories":[{"name":"C/C++","slug":"C-C","permalink":"https://answerywj.com/categories/C-C/"}],"tags":[{"name":"core","slug":"core","permalink":"https://answerywj.com/tags/core/"},{"name":"core dumped","slug":"core-dumped","permalink":"https://answerywj.com/tags/core-dumped/"},{"name":"gdb","slug":"gdb","permalink":"https://answerywj.com/tags/gdb/"}]},{"title":"wav文件格式解析","date":"2022-01-06T02:52:53.000Z","path":"2022/01/06/wav/","permalink":"https://answerywj.com/2022/01/06/wav/","categories":[{"name":"语音","slug":"语音","permalink":"https://answerywj.com/categories/%E8%AF%AD%E9%9F%B3/"}],"tags":[{"name":"wav","slug":"wav","permalink":"https://answerywj.com/tags/wav/"},{"name":"header","slug":"header","permalink":"https://answerywj.com/tags/header/"}]},{"title":"inline使用注意事项","date":"2021-07-28T06:34:31.000Z","path":"2021/07/28/tips-of-inline/","permalink":"https://answerywj.com/2021/07/28/tips-of-inline/","categories":[{"name":"C/C++","slug":"C-C","permalink":"https://answerywj.com/categories/C-C/"}],"tags":[{"name":"inline","slug":"inline","permalink":"https://answerywj.com/tags/inline/"},{"name":"O0","slug":"O0","permalink":"https://answerywj.com/tags/O0/"}]},{"title":"getrusage-进程资源统计函数","date":"2021-06-23T07:41:07.000Z","path":"2021/06/23/getrusage/","permalink":"https://answerywj.com/2021/06/23/getrusage/","categories":[{"name":"C/C++","slug":"C-C","permalink":"https://answerywj.com/categories/C-C/"}],"tags":[{"name":"getrusage","slug":"getrusage","permalink":"https://answerywj.com/tags/getrusage/"}]},{"title":"RPATH与RUNPATH的区别","date":"2021-02-22T10:26:04.000Z","path":"2021/02/22/difference-between-RPATH-and-RUNPATH/","permalink":"https://answerywj.com/2021/02/22/difference-between-RPATH-and-RUNPATH/","categories":[{"name":"编译链接","slug":"编译链接","permalink":"https://answerywj.com/categories/%E7%BC%96%E8%AF%91%E9%93%BE%E6%8E%A5/"}],"tags":[{"name":"RPATH","slug":"RPATH","permalink":"https://answerywj.com/tags/RPATH/"},{"name":"RUNPATH","slug":"RUNPATH","permalink":"https://answerywj.com/tags/RUNPATH/"},{"name":"LD_DEBUG","slug":"LD-DEBUG","permalink":"https://answerywj.com/tags/LD-DEBUG/"}]},{"title":"Git速查手册(第三版)","date":"2020-09-29T07:13:42.000Z","path":"2020/09/29/git-help-v3/","permalink":"https://answerywj.com/2020/09/29/git-help-v3/","categories":[{"name":"Git","slug":"Git","permalink":"https://answerywj.com/categories/Git/"}],"tags":[{"name":"git","slug":"git","permalink":"https://answerywj.com/tags/git/"}]},{"title":"写好技术简历的一些建议","date":"2020-07-03T03:00:04.000Z","path":"2020/07/03/gudie-of-technical-resume/","permalink":"https://answerywj.com/2020/07/03/gudie-of-technical-resume/","categories":[{"name":"科普","slug":"科普","permalink":"https://answerywj.com/categories/%E7%A7%91%E6%99%AE/"}],"tags":[{"name":"resume","slug":"resume","permalink":"https://answerywj.com/tags/resume/"},{"name":"技术简历","slug":"技术简历","permalink":"https://answerywj.com/tags/%E6%8A%80%E6%9C%AF%E7%AE%80%E5%8E%86/"},{"name":"求职招聘","slug":"求职招聘","permalink":"https://answerywj.com/tags/%E6%B1%82%E8%81%8C%E6%8B%9B%E8%81%98/"}]},{"title":"--hash-style兼容性问题","date":"2020-05-14T07:54:25.000Z","path":"2020/05/14/ld-hash-style/","permalink":"https://answerywj.com/2020/05/14/ld-hash-style/","categories":[{"name":"编译链接","slug":"编译链接","permalink":"https://answerywj.com/categories/%E7%BC%96%E8%AF%91%E9%93%BE%E6%8E%A5/"}],"tags":[{"name":"gcc","slug":"gcc","permalink":"https://answerywj.com/tags/gcc/"},{"name":"ld","slug":"ld","permalink":"https://answerywj.com/tags/ld/"},{"name":"hash-style","slug":"hash-style","permalink":"https://answerywj.com/tags/hash-style/"}]},{"title":"Homebrew","date":"2020-02-17T12:42:48.000Z","path":"2020/02/17/homebrew-in-mac/","permalink":"https://answerywj.com/2020/02/17/homebrew-in-mac/","categories":[{"name":"系统配置","slug":"系统配置","permalink":"https://answerywj.com/categories/%E7%B3%BB%E7%BB%9F%E9%85%8D%E7%BD%AE/"}],"tags":[{"name":"mac","slug":"mac","permalink":"https://answerywj.com/tags/mac/"},{"name":"Homebrew","slug":"Homebrew","permalink":"https://answerywj.com/tags/Homebrew/"}]},{"title":"Git仓库过大导致clone失败的解决方法","date":"2019-09-09T04:00:40.000Z","path":"2019/09/09/git-clone-extra-large-project/","permalink":"https://answerywj.com/2019/09/09/git-clone-extra-large-project/","categories":[{"name":"Git","slug":"Git","permalink":"https://answerywj.com/categories/Git/"}],"tags":[{"name":"git仓库过大","slug":"git仓库过大","permalink":"https://answerywj.com/tags/git%E4%BB%93%E5%BA%93%E8%BF%87%E5%A4%A7/"}]},{"title":"将二进制文件作为目标文件中的一个段","date":"2019-07-24T03:50:23.000Z","path":"2019/07/24/binary-to-object-file/","permalink":"https://answerywj.com/2019/07/24/binary-to-object-file/","categories":[{"name":"编译链接","slug":"编译链接","permalink":"https://answerywj.com/categories/%E7%BC%96%E8%AF%91%E9%93%BE%E6%8E%A5/"}],"tags":[{"name":"objdump","slug":"objdump","permalink":"https://answerywj.com/tags/objdump/"},{"name":"elf","slug":"elf","permalink":"https://answerywj.com/tags/elf/"}]},{"title":"深究strtok系列函数","date":"2019-05-21T07:59:44.000Z","path":"2019/05/21/man-strtok/","permalink":"https://answerywj.com/2019/05/21/man-strtok/","categories":[{"name":"C/C++","slug":"C-C","permalink":"https://answerywj.com/categories/C-C/"}],"tags":[{"name":"strtok","slug":"strtok","permalink":"https://answerywj.com/tags/strtok/"},{"name":"strtok_r","slug":"strtok-r","permalink":"https://answerywj.com/tags/strtok-r/"}]},{"title":"sysroot为何物?","date":"2019-04-26T09:59:57.000Z","path":"2019/04/26/what-is-sysroot/","permalink":"https://answerywj.com/2019/04/26/what-is-sysroot/","categories":[{"name":"编译链接","slug":"编译链接","permalink":"https://answerywj.com/categories/%E7%BC%96%E8%AF%91%E9%93%BE%E6%8E%A5/"}],"tags":[{"name":"ld","slug":"ld","permalink":"https://answerywj.com/tags/ld/"},{"name":"sysroot","slug":"sysroot","permalink":"https://answerywj.com/tags/sysroot/"}]},{"title":"屏蔽静态库接口","date":"2019-04-13T06:43:13.000Z","path":"2019/04/13/hide-symbol-of-static-library/","permalink":"https://answerywj.com/2019/04/13/hide-symbol-of-static-library/","categories":[{"name":"编译链接","slug":"编译链接","permalink":"https://answerywj.com/categories/%E7%BC%96%E8%AF%91%E9%93%BE%E6%8E%A5/"}],"tags":[{"name":"hidden","slug":"hidden","permalink":"https://answerywj.com/tags/hidden/"},{"name":"objcopy","slug":"objcopy","permalink":"https://answerywj.com/tags/objcopy/"}]},{"title":"Git速查手册(第二版)","date":"2019-02-12T04:02:40.000Z","path":"2019/02/12/git-help-v2/","permalink":"https://answerywj.com/2019/02/12/git-help-v2/","categories":[{"name":"Git","slug":"Git","permalink":"https://answerywj.com/categories/Git/"}],"tags":[{"name":"git","slug":"git","permalink":"https://answerywj.com/tags/git/"}]},{"title":"C代码覆盖率测试工具Gcov","date":"2018-09-25T10:48:49.000Z","path":"2018/09/25/coverage-of-code/","permalink":"https://answerywj.com/2018/09/25/coverage-of-code/","categories":[{"name":"C/C++","slug":"C-C","permalink":"https://answerywj.com/categories/C-C/"}],"tags":[{"name":"代码覆盖率","slug":"代码覆盖率","permalink":"https://answerywj.com/tags/%E4%BB%A3%E7%A0%81%E8%A6%86%E7%9B%96%E7%8E%87/"}]},{"title":"cJSON的秘密","date":"2018-05-03T08:58:02.000Z","path":"2018/05/03/cjson/","permalink":"https://answerywj.com/2018/05/03/cjson/","categories":[{"name":"C/C++","slug":"C-C","permalink":"https://answerywj.com/categories/C-C/"}],"tags":[{"name":"cJSON","slug":"cJSON","permalink":"https://answerywj.com/tags/cJSON/"}]},{"title":"Linux下core文件使用","date":"2018-03-07T08:16:15.000Z","path":"2018/03/07/usage-of-core-in-linux/","permalink":"https://answerywj.com/2018/03/07/usage-of-core-in-linux/","categories":[{"name":"C/C++","slug":"C-C","permalink":"https://answerywj.com/categories/C-C/"}],"tags":[{"name":"core dump","slug":"core-dump","permalink":"https://answerywj.com/tags/core-dump/"}]},{"title":"Speex介绍","date":"2017-12-29T07:49:34.000Z","path":"2017/12/29/speex/","permalink":"https://answerywj.com/2017/12/29/speex/","categories":[{"name":"语音","slug":"语音","permalink":"https://answerywj.com/categories/%E8%AF%AD%E9%9F%B3/"}],"tags":[{"name":"Speex","slug":"Speex","permalink":"https://answerywj.com/tags/Speex/"}]},{"title":"线程同步机制条件变量的使用与思考","date":"2017-12-15T14:23:08.000Z","path":"2017/12/15/condition-variables-of-thread-synchronization/","permalink":"https://answerywj.com/2017/12/15/condition-variables-of-thread-synchronization/","categories":[{"name":"C/C++","slug":"C-C","permalink":"https://answerywj.com/categories/C-C/"}],"tags":[{"name":"pthread","slug":"pthread","permalink":"https://answerywj.com/tags/pthread/"}]},{"title":"GCC编译ARM篇","date":"2017-08-04T08:30:40.000Z","path":"2017/08/04/gcc-compilation-of-arm-articles/","permalink":"https://answerywj.com/2017/08/04/gcc-compilation-of-arm-articles/","categories":[{"name":"编译链接","slug":"编译链接","permalink":"https://answerywj.com/categories/%E7%BC%96%E8%AF%91%E9%93%BE%E6%8E%A5/"}],"tags":[{"name":"gcc","slug":"gcc","permalink":"https://answerywj.com/tags/gcc/"}]},{"title":"UNIX下IO模型分析","date":"2017-06-27T08:30:40.000Z","path":"2017/06/27/io-model/","permalink":"https://answerywj.com/2017/06/27/io-model/","categories":[{"name":"科普","slug":"科普","permalink":"https://answerywj.com/categories/%E7%A7%91%E6%99%AE/"}],"tags":[{"name":"IO","slug":"IO","permalink":"https://answerywj.com/tags/IO/"}]},{"title":"笔记 | OpenResty系列课程","date":"2017-06-20T09:30:40.000Z","path":"2017/06/20/note-of-openresty-study/","permalink":"https://answerywj.com/2017/06/20/note-of-openresty-study/","categories":[{"name":"Lua","slug":"Lua","permalink":"https://answerywj.com/categories/Lua/"}],"tags":[{"name":"OpenResty","slug":"OpenResty","permalink":"https://answerywj.com/tags/OpenResty/"}]},{"title":"记一次踩坑|空table应该编码为数组还是对象","date":"2017-06-16T07:58:40.000Z","path":"2017/06/16/table-encode-as-array-or-object/","permalink":"https://answerywj.com/2017/06/16/table-encode-as-array-or-object/","categories":[{"name":"Lua","slug":"Lua","permalink":"https://answerywj.com/categories/Lua/"}],"tags":[{"name":"lua-cjson","slug":"lua-cjson","permalink":"https://answerywj.com/tags/lua-cjson/"}]},{"title":"科普|云计算的四种服务模式介绍","date":"2017-03-23T06:18:40.000Z","path":"2017/03/23/introduction-to-four-service-of-cloud-computing/","permalink":"https://answerywj.com/2017/03/23/introduction-to-four-service-of-cloud-computing/","categories":[{"name":"科普","slug":"科普","permalink":"https://answerywj.com/categories/%E7%A7%91%E6%99%AE/"}],"tags":[{"name":"Cloud Computing","slug":"Cloud-Computing","permalink":"https://answerywj.com/tags/Cloud-Computing/"}]},{"title":"UNIX网络编程-listen函数及其包裹函数介绍","date":"2017-02-23T09:14:17.000Z","path":"2017/02/23/listen-in-unix/","permalink":"https://answerywj.com/2017/02/23/listen-in-unix/","categories":[{"name":"C/C++","slug":"C-C","permalink":"https://answerywj.com/categories/C-C/"}],"tags":[{"name":"tcp","slug":"tcp","permalink":"https://answerywj.com/tags/tcp/"},{"name":"listen","slug":"listen","permalink":"https://answerywj.com/tags/listen/"}]},{"title":"C程序判断你主机的数据存储方式(大端和小端)","date":"2016-12-07T03:16:51.000Z","path":"2016/12/07/big-little-endian/","permalink":"https://answerywj.com/2016/12/07/big-little-endian/","categories":[{"name":"C/C++","slug":"C-C","permalink":"https://answerywj.com/categories/C-C/"}],"tags":[{"name":"大小端字节序","slug":"大小端字节序","permalink":"https://answerywj.com/tags/%E5%A4%A7%E5%B0%8F%E7%AB%AF%E5%AD%97%E8%8A%82%E5%BA%8F/"}]},{"title":"从文件流中读写整数--C语言","date":"2016-12-06T06:16:51.000Z","path":"2016/12/06/getw-and-putw/","permalink":"https://answerywj.com/2016/12/06/getw-and-putw/","categories":[{"name":"C/C++","slug":"C-C","permalink":"https://answerywj.com/categories/C-C/"}],"tags":[{"name":"getw","slug":"getw","permalink":"https://answerywj.com/tags/getw/"}]},{"title":"Linux下处理json数据","date":"2016-10-10T02:50:40.000Z","path":"2016/10/10/jq/","permalink":"https://answerywj.com/2016/10/10/jq/","categories":[{"name":"系统配置","slug":"系统配置","permalink":"https://answerywj.com/categories/%E7%B3%BB%E7%BB%9F%E9%85%8D%E7%BD%AE/"}],"tags":[{"name":"json","slug":"json","permalink":"https://answerywj.com/tags/json/"}]},{"title":"Linux下C调用静态库和动态库","date":"2016-10-10T02:50:40.000Z","path":"2016/10/10/use-dynamic-and-static-library/","permalink":"https://answerywj.com/2016/10/10/use-dynamic-and-static-library/","categories":[{"name":"编译链接","slug":"编译链接","permalink":"https://answerywj.com/categories/%E7%BC%96%E8%AF%91%E9%93%BE%E6%8E%A5/"}],"tags":[{"name":"lib","slug":"lib","permalink":"https://answerywj.com/tags/lib/"}]},{"title":"科普|3.5mm耳机国标和美标","date":"2016-09-20T03:37:40.000Z","path":"2016/09/20/standard-of-headphone/","permalink":"https://answerywj.com/2016/09/20/standard-of-headphone/","categories":[{"name":"科普","slug":"科普","permalink":"https://answerywj.com/categories/%E7%A7%91%E6%99%AE/"}],"tags":[{"name":"headset","slug":"headset","permalink":"https://answerywj.com/tags/headset/"}]},{"title":"Shell脚本浮点运算","date":"2016-09-05T06:58:50.000Z","path":"2016/09/05/floating-point-operation-in-script/","permalink":"https://answerywj.com/2016/09/05/floating-point-operation-in-script/","categories":[{"name":"Shell脚本","slug":"Shell脚本","permalink":"https://answerywj.com/categories/Shell%E8%84%9A%E6%9C%AC/"}],"tags":[{"name":"script","slug":"script","permalink":"https://answerywj.com/tags/script/"}]},{"title":"Shell脚本清空文件的几种方法","date":"2016-09-05T03:35:14.000Z","path":"2016/09/05/empty-file-in-shell/","permalink":"https://answerywj.com/2016/09/05/empty-file-in-shell/","categories":[{"name":"Shell脚本","slug":"Shell脚本","permalink":"https://answerywj.com/categories/Shell%E8%84%9A%E6%9C%AC/"}],"tags":[{"name":"script","slug":"script","permalink":"https://answerywj.com/tags/script/"}]},{"title":"Hexo+Github博客备份方法","date":"2016-08-10T13:16:48.000Z","path":"2016/08/10/backup-of-blog-with-hexo-and-github/","permalink":"https://answerywj.com/2016/08/10/backup-of-blog-with-hexo-and-github/","categories":[{"name":"博客建站","slug":"博客建站","permalink":"https://answerywj.com/categories/%E5%8D%9A%E5%AE%A2%E5%BB%BA%E7%AB%99/"}],"tags":[{"name":"git","slug":"git","permalink":"https://answerywj.com/tags/git/"},{"name":"hexo","slug":"hexo","permalink":"https://answerywj.com/tags/hexo/"},{"name":"blog","slug":"blog","permalink":"https://answerywj.com/tags/blog/"}]},{"title":"Linux的硬链接和软链接","date":"2016-08-02T03:46:09.000Z","path":"2016/08/02/link-in-linux/","permalink":"https://answerywj.com/2016/08/02/link-in-linux/","categories":[{"name":"编译链接","slug":"编译链接","permalink":"https://answerywj.com/categories/%E7%BC%96%E8%AF%91%E9%93%BE%E6%8E%A5/"}],"tags":[{"name":"link","slug":"link","permalink":"https://answerywj.com/tags/link/"}]},{"title":"Linux socket编程的心跳机制总结","date":"2016-07-14T06:23:47.000Z","path":"2016/07/14/keepalive-of-socket/","permalink":"https://answerywj.com/2016/07/14/keepalive-of-socket/","categories":[{"name":"C/C++","slug":"C-C","permalink":"https://answerywj.com/categories/C-C/"}],"tags":[{"name":"tcp","slug":"tcp","permalink":"https://answerywj.com/tags/tcp/"},{"name":"keepalive","slug":"keepalive","permalink":"https://answerywj.com/tags/keepalive/"}]},{"title":"UNIX网络编程-connect函数及其包裹函数介绍","date":"2016-07-14T06:22:25.000Z","path":"2016/07/14/connect-in-unix/","permalink":"https://answerywj.com/2016/07/14/connect-in-unix/","categories":[{"name":"C/C++","slug":"C-C","permalink":"https://answerywj.com/categories/C-C/"}],"tags":[{"name":"tcp","slug":"tcp","permalink":"https://answerywj.com/tags/tcp/"},{"name":"connect","slug":"connect","permalink":"https://answerywj.com/tags/connect/"}]},{"title":"Linux C编程的DEBUG宏","date":"2016-07-14T06:20:25.000Z","path":"2016/07/14/debug-macro/","permalink":"https://answerywj.com/2016/07/14/debug-macro/","categories":[{"name":"C/C++","slug":"C-C","permalink":"https://answerywj.com/categories/C-C/"}],"tags":[{"name":"debug","slug":"debug","permalink":"https://answerywj.com/tags/debug/"}]},{"title":"UNIX编程安全读写函数","date":"2016-07-14T06:19:20.000Z","path":"2016/07/14/safe-read-and-write/","permalink":"https://answerywj.com/2016/07/14/safe-read-and-write/","categories":[{"name":"C/C++","slug":"C-C","permalink":"https://answerywj.com/categories/C-C/"}],"tags":[{"name":"read","slug":"read","permalink":"https://answerywj.com/tags/read/"},{"name":"write","slug":"write","permalink":"https://answerywj.com/tags/write/"}]},{"title":"C语言生成随机数","date":"2016-07-14T06:16:51.000Z","path":"2016/07/14/generate-random-numbers/","permalink":"https://answerywj.com/2016/07/14/generate-random-numbers/","categories":[{"name":"C/C++","slug":"C-C","permalink":"https://answerywj.com/categories/C-C/"}],"tags":[{"name":"随机数","slug":"随机数","permalink":"https://answerywj.com/tags/%E9%9A%8F%E6%9C%BA%E6%95%B0/"}]},{"title":"Linux Shell 脚本调试总结","date":"2016-07-14T06:15:14.000Z","path":"2016/07/14/debug-for-shell-script/","permalink":"https://answerywj.com/2016/07/14/debug-for-shell-script/","categories":[{"name":"Shell脚本","slug":"Shell脚本","permalink":"https://answerywj.com/categories/Shell%E8%84%9A%E6%9C%AC/"}],"tags":[{"name":"debug","slug":"debug","permalink":"https://answerywj.com/tags/debug/"}]},{"title":"Linux下adb devices no permissions解决方案","date":"2016-07-14T06:11:03.000Z","path":"2016/07/14/solution-of-adb-devices-no-permissions/","permalink":"https://answerywj.com/2016/07/14/solution-of-adb-devices-no-permissions/","categories":[{"name":"系统配置","slug":"系统配置","permalink":"https://answerywj.com/categories/%E7%B3%BB%E7%BB%9F%E9%85%8D%E7%BD%AE/"}],"tags":[{"name":"adb","slug":"adb","permalink":"https://answerywj.com/tags/adb/"}]},{"title":"Linux下脚本录制工具——script和scriptreplay","date":"2016-07-14T06:04:51.000Z","path":"2016/07/14/script-and-scriptreplay/","permalink":"https://answerywj.com/2016/07/14/script-and-scriptreplay/","categories":[{"name":"系统配置","slug":"系统配置","permalink":"https://answerywj.com/categories/%E7%B3%BB%E7%BB%9F%E9%85%8D%E7%BD%AE/"}],"tags":[{"name":"script","slug":"script","permalink":"https://answerywj.com/tags/script/"},{"name":"scriptreplay","slug":"scriptreplay","permalink":"https://answerywj.com/tags/scriptreplay/"}]},{"title":"Linux fork炸弹解析","date":"2016-07-14T05:52:31.000Z","path":"2016/07/14/fork-bomb/","permalink":"https://answerywj.com/2016/07/14/fork-bomb/","categories":[{"name":"Shell脚本","slug":"Shell脚本","permalink":"https://answerywj.com/categories/Shell%E8%84%9A%E6%9C%AC/"}],"tags":[{"name":"fork bomb","slug":"fork-bomb","permalink":"https://answerywj.com/tags/fork-bomb/"}]}],"categories":[{"name":"C/C++","slug":"C-C","permalink":"https://answerywj.com/categories/C-C/"},{"name":"语音","slug":"语音","permalink":"https://answerywj.com/categories/%E8%AF%AD%E9%9F%B3/"},{"name":"编译链接","slug":"编译链接","permalink":"https://answerywj.com/categories/%E7%BC%96%E8%AF%91%E9%93%BE%E6%8E%A5/"},{"name":"Git","slug":"Git","permalink":"https://answerywj.com/categories/Git/"},{"name":"科普","slug":"科普","permalink":"https://answerywj.com/categories/%E7%A7%91%E6%99%AE/"},{"name":"系统配置","slug":"系统配置","permalink":"https://answerywj.com/categories/%E7%B3%BB%E7%BB%9F%E9%85%8D%E7%BD%AE/"},{"name":"Lua","slug":"Lua","permalink":"https://answerywj.com/categories/Lua/"},{"name":"Shell脚本","slug":"Shell脚本","permalink":"https://answerywj.com/categories/Shell%E8%84%9A%E6%9C%AC/"},{"name":"博客建站","slug":"博客建站","permalink":"https://answerywj.com/categories/%E5%8D%9A%E5%AE%A2%E5%BB%BA%E7%AB%99/"}],"tags":[{"name":"core","slug":"core","permalink":"https://answerywj.com/tags/core/"},{"name":"core dumped","slug":"core-dumped","permalink":"https://answerywj.com/tags/core-dumped/"},{"name":"gdb","slug":"gdb","permalink":"https://answerywj.com/tags/gdb/"},{"name":"wav","slug":"wav","permalink":"https://answerywj.com/tags/wav/"},{"name":"header","slug":"header","permalink":"https://answerywj.com/tags/header/"},{"name":"inline","slug":"inline","permalink":"https://answerywj.com/tags/inline/"},{"name":"O0","slug":"O0","permalink":"https://answerywj.com/tags/O0/"},{"name":"getrusage","slug":"getrusage","permalink":"https://answerywj.com/tags/getrusage/"},{"name":"RPATH","slug":"RPATH","permalink":"https://answerywj.com/tags/RPATH/"},{"name":"RUNPATH","slug":"RUNPATH","permalink":"https://answerywj.com/tags/RUNPATH/"},{"name":"LD_DEBUG","slug":"LD-DEBUG","permalink":"https://answerywj.com/tags/LD-DEBUG/"},{"name":"git","slug":"git","permalink":"https://answerywj.com/tags/git/"},{"name":"resume","slug":"resume","permalink":"https://answerywj.com/tags/resume/"},{"name":"技术简历","slug":"技术简历","permalink":"https://answerywj.com/tags/%E6%8A%80%E6%9C%AF%E7%AE%80%E5%8E%86/"},{"name":"求职招聘","slug":"求职招聘","permalink":"https://answerywj.com/tags/%E6%B1%82%E8%81%8C%E6%8B%9B%E8%81%98/"},{"name":"gcc","slug":"gcc","permalink":"https://answerywj.com/tags/gcc/"},{"name":"ld","slug":"ld","permalink":"https://answerywj.com/tags/ld/"},{"name":"hash-style","slug":"hash-style","permalink":"https://answerywj.com/tags/hash-style/"},{"name":"mac","slug":"mac","permalink":"https://answerywj.com/tags/mac/"},{"name":"Homebrew","slug":"Homebrew","permalink":"https://answerywj.com/tags/Homebrew/"},{"name":"git仓库过大","slug":"git仓库过大","permalink":"https://answerywj.com/tags/git%E4%BB%93%E5%BA%93%E8%BF%87%E5%A4%A7/"},{"name":"objdump","slug":"objdump","permalink":"https://answerywj.com/tags/objdump/"},{"name":"elf","slug":"elf","permalink":"https://answerywj.com/tags/elf/"},{"name":"strtok","slug":"strtok","permalink":"https://answerywj.com/tags/strtok/"},{"name":"strtok_r","slug":"strtok-r","permalink":"https://answerywj.com/tags/strtok-r/"},{"name":"sysroot","slug":"sysroot","permalink":"https://answerywj.com/tags/sysroot/"},{"name":"hidden","slug":"hidden","permalink":"https://answerywj.com/tags/hidden/"},{"name":"objcopy","slug":"objcopy","permalink":"https://answerywj.com/tags/objcopy/"},{"name":"代码覆盖率","slug":"代码覆盖率","permalink":"https://answerywj.com/tags/%E4%BB%A3%E7%A0%81%E8%A6%86%E7%9B%96%E7%8E%87/"},{"name":"cJSON","slug":"cJSON","permalink":"https://answerywj.com/tags/cJSON/"},{"name":"core dump","slug":"core-dump","permalink":"https://answerywj.com/tags/core-dump/"},{"name":"Speex","slug":"Speex","permalink":"https://answerywj.com/tags/Speex/"},{"name":"pthread","slug":"pthread","permalink":"https://answerywj.com/tags/pthread/"},{"name":"IO","slug":"IO","permalink":"https://answerywj.com/tags/IO/"},{"name":"OpenResty","slug":"OpenResty","permalink":"https://answerywj.com/tags/OpenResty/"},{"name":"lua-cjson","slug":"lua-cjson","permalink":"https://answerywj.com/tags/lua-cjson/"},{"name":"Cloud Computing","slug":"Cloud-Computing","permalink":"https://answerywj.com/tags/Cloud-Computing/"},{"name":"tcp","slug":"tcp","permalink":"https://answerywj.com/tags/tcp/"},{"name":"listen","slug":"listen","permalink":"https://answerywj.com/tags/listen/"},{"name":"大小端字节序","slug":"大小端字节序","permalink":"https://answerywj.com/tags/%E5%A4%A7%E5%B0%8F%E7%AB%AF%E5%AD%97%E8%8A%82%E5%BA%8F/"},{"name":"getw","slug":"getw","permalink":"https://answerywj.com/tags/getw/"},{"name":"json","slug":"json","permalink":"https://answerywj.com/tags/json/"},{"name":"lib","slug":"lib","permalink":"https://answerywj.com/tags/lib/"},{"name":"headset","slug":"headset","permalink":"https://answerywj.com/tags/headset/"},{"name":"script","slug":"script","permalink":"https://answerywj.com/tags/script/"},{"name":"hexo","slug":"hexo","permalink":"https://answerywj.com/tags/hexo/"},{"name":"blog","slug":"blog","permalink":"https://answerywj.com/tags/blog/"},{"name":"link","slug":"link","permalink":"https://answerywj.com/tags/link/"},{"name":"keepalive","slug":"keepalive","permalink":"https://answerywj.com/tags/keepalive/"},{"name":"connect","slug":"connect","permalink":"https://answerywj.com/tags/connect/"},{"name":"debug","slug":"debug","permalink":"https://answerywj.com/tags/debug/"},{"name":"read","slug":"read","permalink":"https://answerywj.com/tags/read/"},{"name":"write","slug":"write","permalink":"https://answerywj.com/tags/write/"},{"name":"随机数","slug":"随机数","permalink":"https://answerywj.com/tags/%E9%9A%8F%E6%9C%BA%E6%95%B0/"},{"name":"adb","slug":"adb","permalink":"https://answerywj.com/tags/adb/"},{"name":"scriptreplay","slug":"scriptreplay","permalink":"https://answerywj.com/tags/scriptreplay/"},{"name":"fork bomb","slug":"fork-bomb","permalink":"https://answerywj.com/tags/fork-bomb/"}]} \ No newline at end of file diff --git a/css/dark.css b/css/dark.css new file mode 100644 index 000000000..62aaeb301 --- /dev/null +++ b/css/dark.css @@ -0,0 +1,7 @@ +:root{--base-font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Arial, + 'PingFang SC', 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei', + 'Microsoft JhengHei', 'Source Han Sans SC', 'Noto Sans CJK SC', + 'Source Han Sans CN', 'Noto Sans SC', 'Source Han Sans TC', + 'Noto Sans CJK TC', 'WenQuanYi Micro Hei', SimSun, sans-serif}@font-face{font-family:'iconfont-archer';src:url("//at.alicdn.com/t/font_327081_s1wbjxwfu9c.eot");src:url("//at.alicdn.com/t/font_327081_s1wbjxwfu9c.eot?#iefix") format("embedded-opentype"),url("//at.alicdn.com/t/font_327081_s1wbjxwfu9c.woff") format("woff"),url("//at.alicdn.com/t/font_327081_s1wbjxwfu9c.ttf") format("truetype"),url("//at.alicdn.com/t/font_327081_s1wbjxwfu9c.svg#iconfont-archer") format("svg")}.iconfont-archer{font-family:'iconfont-archer' !important;font-size:1rem;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{background-color:#121212}.background-holder{background-color:#121212}.container{background-color:#121212}::-moz-selection{background:#f75357;color:snow}::selection{background:#f75357;color:snow}.note{background-color:#1e1e1e !important}.back-top{border-color:rgba(255,255,255,0.87);background-color:rgba(18,18,18,0.8);color:rgba(255,255,255,0.87)}.back-top:hover{background-color:rgba(255,255,255,0.87);color:#121212}.back-top-rounded{color:#fff;background-color:#121212}.back-top-rounded:hover{color:#333}.footer{background-color:#121212}.copyright a{color:#f75357}#busuanzi_container_site_pv,#busuanzi_container_site_uv{color:rgba(255,255,255,0.38)}.read-progress{background-color:rgba(255,255,255,0.6)}.read-progress-feature{background-color:#f75357}.banner{border-bottom-color:rgba(255,255,255,0.87);background-color:rgba(0,0,0,0.8)}.banner .blog-title a{color:rgba(255,255,255,0.87)}.banner .blog-title a:hover{color:#f75357}.banner .post-title a{color:rgba(255,255,255,0.87)}.banner.banner-clean{background-color:rgba(0,0,0,0.9)}.header-sidebar-menu{border-color:#fff;color:#fff}.header-sidebar-menu:hover{background-color:#fff;color:#000}.header-sidebar-menu-rounded:hover{background-color:transparent;color:#f75357}.header-sidebar-menu-black{color:rgba(255,255,255,0.87);background-color:#121212;border-color:rgba(255,255,255,0.87)}.header-sidebar-menu-black:hover{background-color:rgba(255,255,255,0.87);color:#121212}.header-actions .home-link a:hover{color:#f75357}.profile{color:#777;border-color:rgba(255,255,255,0.1)}.profile-avatar{border-color:rgba(255,255,255,0.1)}.profile-name{color:#ddd}.profile-social{border-color:rgba(255,255,255,0.1)}.friends{border-color:rgba(255,255,255,0.1)}.friends a{color:#777}.friends a:hover{color:#f75357}.profile-link-item{border-color:rgba(255,255,255,0.1)}.profile-link-item a{color:#777}.profile-link-item a:hover{color:#f75357}.popup{background:#121212;color:#e1e1e1;box-shadow:0px 0px 10px rgba(255,255,255,0.5)}.algolia-search{border-bottom-color:#222;background-color:#181818}.algolia-search-input input{color:rgba(255,255,255,0.87)}.algolia-hit-item:hover{border-bottom:1px solid;background-color:#181818}.algolia-hit-item-link{color:rgba(255,255,255,0.87)}.popup-btn-close{color:#f75357}.algolia-hit-item-link em{color:#f75357}.ais-Pagination-item a{color:#f75357}.abstract-content code,.article-entry code{background:#282c34}.archive-post-item:hover{border-left-color:#f75357}.archive-post-item:hover .archive-post-date,.archive-post-item:hover .archive-post-title{color:#f75357}.site-search .search-icon{color:#f75357}.archive-year,.total-archive{color:#f75357}.sidebar-tag-name:hover,.sidebar-category-name:hover{border-color:#f75357;color:#f75357}.sidebar-label-focus{border-color:#f75357;color:#f75357}.sidebar-tabs::after{background-color:#f75357}.index-post{background-color:#181818;margin-bottom:1rem}.index-post .abstract-content{color:rgba(255,255,255,0.6)}.abstract-title{color:rgba(255,255,255,0.87)}.abstract-title:hover{color:#f75357}.index-post .abstract-read-more-button a{color:rgba(255,255,255,0.38)}.index-post .abstract-read-more-button a:hover{color:#f75357}.abstract-post-meta{color:rgba(255,255,255,0.38)}.abstract-post-meta a{color:rgba(255,255,255,0.38)}.abstract-post-meta .post-tag::after{content:'';position:absolute;left:calc((100% - 98%) / 2);bottom:-15%;transition:all 0.15s ease-in;width:98%;height:2px;transform:translate(0, 0);background-color:rgba(255,255,255,0.38);opacity:0}.abstract-post-meta .post-tag:hover::after{transform:translate(0, -2px);opacity:1}.index-post-divider{display:none}.anchorjs-archer{color:#f75357}.article-entry{background-color:#181818}.abstract-content,.article-entry{color:rgba(255,255,255,0.87)}.abstract-content blockquote,.article-entry blockquote{background-color:#1e1e1e;border-left-color:#f75357}.abstract-content .table-container table,.abstract-content>table,.article-entry .table-container table,.article-entry>table{border-color:#1e1e1e;box-shadow:2px 2px 2px rgba(255,255,255,0.125)}.abstract-content .table-container table thead tr,.abstract-content>table thead tr,.article-entry .table-container table thead tr,.article-entry>table thead tr{background:#1e1e1e}.abstract-content .table-container table tbody tr:hover,.abstract-content>table tbody tr:hover,.article-entry .table-container table tbody tr:hover,.article-entry>table tbody tr:hover{background:#242424}.abstract-content .table-container table td,.abstract-content .table-container table th,.abstract-content>table td,.abstract-content>table th,.article-entry .table-container table td,.article-entry .table-container table th,.article-entry>table td,.article-entry>table th{border-color:#2a2a2a}.abstract-content a,.article-entry a{color:#f75357}.abstract-content a:hover,.article-entry a:hover{border-bottom-color:#f75357}.license-wrapper{background-color:#181818}.license-wrapper{color:rgba(255,255,255,0.87)}.license-wrapper a{color:#f75357}.toc-wrapper .toc-active{color:#f75357}.toc-wrapper a{color:#777}.toc-wrapper a:hover{color:#f75357}.toc-catalog:hover{color:#f75357}.post-paginator .nextTitle,.post-paginator .prevTitle{color:rgba(255,255,255,0.38)}.post-paginator .nextTitle:hover,.post-paginator .prevTitle:hover{color:#f75357}.post-paginator .nextSlogan,.post-paginator .prevSlogan{color:rgba(255,255,255,0.6)}#gitalk-container *{color:rgba(255,255,255,0.87)}#gitalk-container textarea,#gitalk-container .gt-header-preview *,#gitalk-container .gt-comment-content *,#gitalk-container .gt-action *,#gitalk-container .gt-version{color:#333}#gitalk-container a{color:#f75357 !important}#gitalk-container a:hover{color:#fcb4b6 !important;border-color:#fcb4b6 !important}#gitalk-container .gt-svg svg{fill:#f75357 !important}#gitalk-container .gt-spinner::before{border-color:#fff !important;border-top-color:#f75357 !important}#gitalk-container .gt-btn{background-color:#f75357 !important;border-color:#f75357 !important;color:#fff !important}#gitalk-container .gt-btn-login:hover{background-color:#fcb4b6 !important;border-color:#fcb4b6 !important}#gitalk-container .gt-btn-preview{background-color:#fff !important;color:#f75357 !important}#gitalk-container .gt-btn-preview:hover{background-color:#f2f2f2 !important;border-color:#fcb4b6 !important}#gitalk-container .gt-btn-preview .gt-btn-text{color:#f75357 !important}#gitalk-container .gt-btn-public:hover{background-color:#fcb4b6 !important;border-color:#fcb4b6 !important}#gitalk-container .gt-link{border-bottom-color:#f75357 !important}#gitalk-container .gt-user .is--poping .gt-ico svg{fill:#f75357 !important}#gitalk-container .gt-popup .gt-action.is--active:before{background:#f75357 !important}#gitalk-container .gt-header-controls-tip{color:#f75357 !important}#gitalk-container .gt-comment-username{color:#f75357 !important} + +/*# sourceMappingURL=dark.css.map */ diff --git a/css/dark.css.map b/css/dark.css.map new file mode 100644 index 000000000..44736be99 --- /dev/null +++ b/css/dark.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["_variables.scss","_dark/_common-dark.scss","_dark/_partial/_partial/_footer-fixed-dark.scss","_dark/_partial/_partial/_footer-dark.scss","_dark/_partial/_partial/_header-dark.scss","_dark/_partial/_partial/_profile-dark.scss","_dark/_partial/_algolia-dark.scss","_dark/_partial/_post/_code-dark.scss","_dark/_partial/_sidebar/_sidebar-archive-dark.scss","_dark/_partial/_sidebar/_sidebar-tags-dark.scss","_dark/_partial/_sidebar/_sidebar-dark.scss","_dark/_partial/_index-page-dark.scss","_mixin.scss","_dark/_partial/_post-page-dark.scss","_dark/_partial/_comment/_gitalk-dark.scss"],"names":[],"mappings":"AAEA,MACE;;;;iEAAmB,CAKpB,WAsCC,6BAA8B,CAC9B,wDAAyD,CACzD,2TAKiB,CAGnB,iBACE,wCAAyC,CACzC,cAAe,CACf,iBAAkB,CAClB,kCAAmC,CACnC,iCAAkC,CACnC,KC7DC,wBDiBkC,CChBnC,mBAGC,wBDakC,CCZnC,WAGC,wBDSkC,CCRnC,iBAGC,kBDD0B,CCE1B,UDsB8B,CC1B/B,YAGC,kBDD0B,CCE1B,UDsB8B,CCrB/B,MAGC,mCAAoC,CACrC,UClBC,mCFsCiD,CErCjD,mCAAuC,CACvC,4BFoCiD,CEvCnD,gBAKI,uCFkC+C,CEjC/C,aFYgC,CEXjC,kBAID,UFK0B,CEJ1B,wBFMkC,CERpC,wBAII,UAAW,CACZ,QCdD,wBHiBkC,CGhBnC,aAIG,aHMwB,CGLzB,wDAKD,4BH6B+C,CG5BhD,eCZC,sCJuCkD,CItCnD,uBAGC,wBJO0B,CIN3B,QAGC,0CJ8BiD,CI7BjD,gCAAoC,CAFtC,sBAMM,4BJyB6C,CI/BnD,4BAQQ,aJJoB,CIJ5B,sBAeM,4BJgB6C,CI/BnD,qBAoBI,gCAAoC,CACrC,qBAID,iBJjB0B,CIkB1B,UJlB0B,CIgB5B,2BAII,qBJpBwB,CIqBxB,UAAW,CACZ,mCAKC,4BAA6B,CAC7B,aJhCwB,CIiCzB,2BAID,4BJViD,CIWjD,wBJhCkC,CIiClC,mCJZiD,CISnD,iCAKI,uCJd+C,CIe/C,aJpCgC,CIqCjC,mCAOK,aJlDoB,CImDrB,SC9DL,ULqG+B,CKpG/B,kCAAsC,CACvC,gBAGC,kCAAsC,CACvC,cAGC,UAAW,CACZ,gBAGC,kCAAsC,CACvC,SAGC,kCAAsC,CADxC,WAII,ULiF6B,CKrFjC,iBAMM,aLXsB,CKYvB,mBAKH,kCAAsC,CADxC,qBAII,ULsE6B,CK1EjC,2BAMM,aLtBsB,CKuBvB,OClCH,kBNiBkC,CMhBlC,aAAc,CACd,6CAAiD,CAClD,gBAGC,wBAAyB,CACzB,wBNW6B,CMV9B,4BAGC,4BN2BiD,CM1BlD,wBAIG,uBAAwB,CACxB,wBNC2B,CMA5B,uBAID,4BNgBiD,CMflD,iBAGC,aNf0B,CMgB3B,0BAMO,aNtBoB,CMuBrB,uBAOH,aN9BwB,CM+BzB,2CCxCC,kBAAmB,CACpB,yBCFC,yBRUwB,CQZ5B,yFAKM,aROsB,CQNvB,0BAMD,aRAwB,CQCzB,6BAKD,aRN0B,CQO3B,qDChBG,oBTSwB,CSRxB,aTQwB,CSPzB,qBAID,oBTG0B,CSF1B,aTE0B,CSD3B,qBCTG,wBVUwB,CUTzB,YCFD,wBXkB6B,CWjB7B,kBAAmB,CACpB,8BAIG,2BXiCgD,CWhCjD,gBAID,4BX2BiD,CW5BnD,sBAII,aXHwB,CWIzB,yCAMG,4BXmB2C,CWtBjD,+CAKQ,aXZoB,CWarB,oBAML,4BXU+C,CWXjD,sBAII,4BXO6C,CYvC/C,qCACE,UAAW,CACX,iBAAkB,CAClB,2BAAkC,CAClC,WAAY,CACZ,4BAA6B,CAC7B,SAPuC,CAQvC,UAR0B,CAS1B,yBAA0B,CAC1B,uCZ8B6C,CY7B7C,SAAU,CACX,2CAEC,4BAA6B,CAC7B,SAAU,CACX,oBD0BD,YAAa,CACd,iBE3CC,abW0B,CaV3B,eAGC,wBbc6B,Cab9B,iCAIC,4Bb6BiD,Ca/BnD,uDAII,wBAAyB,CACzB,yBbDwB,CaJ5B,4HASI,oBAAqB,CACrB,8CAAkD,CAVtD,gKAaQ,kBAAmB,CAb3B,wLAkBQ,kBAAmB,CAlB3B,gRAuBM,oBAAqB,CAvB3B,qCA2BI,abvBwB,CaJ5B,iDA6BM,2BbzBsB,Ca0BvB,iBAKH,wBbxB6B,CayB9B,iBAGC,4BbRiD,CaOnD,mBAGI,abrCwB,CasCzB,yBAKC,ab3CwB,CayC5B,eAKI,UAAW,CALf,qBAQI,abjDwB,CakDzB,mBAKC,abvDwB,CawDzB,sDAMC,4BbjC6C,Ca8BjD,kEAKM,abhEsB,Ca2D5B,wDAWI,2Bb1CgD,Ca2CjD,oBC7EC,4BdiC+C,CcnCnD,uKAUI,UAAW,CAVf,oBAcI,wBAAgC,CAdpC,0BAgBM,wBAAwC,CACxC,+BAA+C,CAjBrD,8BAsBI,uBAA+B,CAtBnC,sCA0BI,4BAAsC,CACtC,mCAA2C,CA3B/C,0BA+BI,mCAA2C,CAC3C,+BAAuC,CACvC,qBAA+B,CAjCnC,sCAoCQ,mCAAmD,CACnD,+BAA+C,CArCvD,kCAyCM,gCAA0C,CAC1C,wBAAgC,CA1CtC,wCA4CQ,mCAAsD,CACtD,+BAA+C,CA7CvD,+CAgDQ,wBAAgC,CAhDxC,uCAqDQ,mCAAmD,CACnD,+BAA+C,CAtDvD,2BA4DI,sCAA8C,CA5DlD,mDAgEI,uBAA+B,CAhEnC,yDAoEI,6BAAqC,CApEzC,0CAwEI,wBAAgC,CAxEpC,uCA4EI,wBAAgC","file":"dark.css","sourcesContent":["// You can change the following settings by yourself :-)\n\n:root {\n --base-font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Arial,\n 'PingFang SC', 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei',\n 'Microsoft JhengHei', 'Source Han Sans SC', 'Noto Sans CJK SC',\n 'Source Han Sans CN', 'Noto Sans SC', 'Source Han Sans TC',\n 'Noto Sans CJK TC', 'WenQuanYi Micro Hei', SimSun, sans-serif;\n}\n\n// ========== DIY ========== //\n$feature-color: #f75357;\n$feature-color-dark: #f75357; // Feature color in dark mode\n$code-theme: 'atom-one-dark'; // atom-one-dark or atom-one-light\n\n// ========== global variables ========== //\n$body-background-color: #fff;\n$foreground-color: #fdfdfd;\n$body-background-color-dark: #121212;\n$foreground-color-dark: #181818;\n$base-font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Arial,\n 'PingFang SC', 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei',\n 'Microsoft JhengHei', 'Source Han Sans SC', 'Noto Sans CJK SC',\n 'Source Han Sans CN', 'Noto Sans SC', 'Source Han Sans TC', 'Noto Sans CJK TC',\n 'WenQuanYi Micro Hei', SimSun, sans-serif;\n$feature-font-family: 'Oswald-Regular', $base-font-family;\n$base-font-size: 16px !default;\n\n// ========== CSS Variables ========== //\n$base-font-family: var(--base-font-family);\n\n// ========== common ========== //\n$container-margin-top: 3rem;\n$selection-background-color: $feature-color;\n$selection-background-color-dark: $feature-color-dark;\n$selection-text-color: #eee;\n$selection-text-color-dark: snow;\n\n// ========= dark mode ========= //\n$text-color-primary-dark: rgba(255, 255, 255, 0.87);\n$text-color-secondary-dark: rgba(255, 255, 255, 0.6);\n$text-color-minor-dark: rgba(255, 255, 255, 0.38);\n$transition-animation: all 0.5s ease-out;\n\n// ========== iconfont ========== //\n@font-face {\n font-family: 'iconfont-archer'; /* project id 327081 */\n src: url('//at.alicdn.com/t/font_327081_s1wbjxwfu9c.eot');\n src: url('//at.alicdn.com/t/font_327081_s1wbjxwfu9c.eot?#iefix')\n format('embedded-opentype'),\n url('//at.alicdn.com/t/font_327081_s1wbjxwfu9c.woff') format('woff'),\n url('//at.alicdn.com/t/font_327081_s1wbjxwfu9c.ttf') format('truetype'),\n url('//at.alicdn.com/t/font_327081_s1wbjxwfu9c.svg#iconfont-archer')\n format('svg');\n}\n\n.iconfont-archer {\n font-family: 'iconfont-archer' !important;\n font-size: 1rem;\n font-style: normal;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// ======= fixed footer ======= //\n$footer-fixed-height: 3.5rem;\n\n// ========== header ========== //\n$header-height: 3.5rem;\n$header-height-mobile: 3rem;\n$header-border-top-width: 3px;\n$header-border-top-color: rgba(0, 0, 0, 0.75);\n$header-border-top-color-dark: rgba(0, 0, 0, 0.75);\n$header-banner-text-color: #333;\n$header-banner-text-color-dark: $text-color-primary-dark;\n\n// ========= sidebar ========= //\n$sidebar-width: 400px;\n\n// ========== profile ========== //\n$profile-width: 200px;\n\n// ========== index ========== //\n$index-post-link-color: #1f1f1f;\n$index-post-link-color-dark: #ccc;\n$index-post-tag-color: #aaa;\n$index-post-tag-color-dark: $text-color-minor-dark;\n\n// ===== abstract content ===== //\n$abstract-content-title-color: #333;\n$abstract-content-title-color-dark: $text-color-primary-dark;\n$abstract-content-text-color: #585858;\n$abstract-content-text-color-dark: $text-color-secondary-dark;\n$abstract-post-meta-color: #aaa;\n$abstract-post-meta-color-dark: $text-color-minor-dark;\n\n// ========== post ========== //\n$post-content-color: #23394d;\n$post-content-color-dark: $text-color-primary-dark;\n\n// ========== social ========== //\n$social-iconfont-color: #777;\n$social-iconfont-color-dark: #777;\n\n// ========== code ========== //\n$code-color-map: (\n 'atom-one-light': (\n base: #fafafa,\n mono-1: #383a42,\n mono-2: #686b77,\n mono-3: #a0a1a7,\n hue-1: #0184bb,\n hue-2: #4078f2,\n hue-3: #a626a4,\n hue-4: #50a14f,\n hue-5: #e45649,\n hue-5-2: #c91243,\n hue-6: #986801,\n hue-6-2: #c18401,\n ),\n 'atom-one-dark': (\n base: #282c34,\n mono-1: #abb2bf,\n mono-2: #818896,\n mono-3: #5c6370,\n hue-1: #56b6c2,\n hue-2: #61aeee,\n hue-3: #c678dd,\n hue-4: #98c379,\n hue-5: #e06c75,\n hue-5-2: #be5046,\n hue-6: #d19a66,\n hue-6-2: #e6c07b,\n ),\n);\n@if not(map-has-key($code-color-map, $code-theme)) {\n $code-theme: 'atom-one-dark';\n}\n$theme-colors: map-get($code-color-map, $code-theme);\n\n// ========== algolia-search ========== //\n$algolia-search-padding-horiz: 20px;\n","body {\n background-color: $body-background-color-dark;\n}\n\n.background-holder {\n background-color: $body-background-color-dark;\n}\n\n.container {\n background-color: $body-background-color-dark;\n}\n\n::selection {\n background: $selection-background-color-dark;\n color: $selection-text-color-dark;\n}\n\n.note {\n background-color: #1e1e1e !important;\n}\n",".back-top {\n border-color: $text-color-primary-dark;\n background-color: rgba(18, 18, 18, 0.8);\n color: $text-color-primary-dark;\n &:hover {\n background-color: $text-color-primary-dark;\n color: $body-background-color-dark;\n }\n}\n\n.back-top-rounded {\n color: $body-background-color;\n background-color: $body-background-color-dark;\n &:hover {\n color: #333;\n }\n}\n",".footer {\n background-color: $body-background-color-dark;\n}\n\n.copyright {\n a {\n color: $feature-color-dark;\n }\n}\n\n#busuanzi_container_site_pv,\n#busuanzi_container_site_uv {\n color: $text-color-minor-dark;\n}\n",".read-progress {\n background-color: $text-color-secondary-dark;\n}\n\n.read-progress-feature {\n background-color: $feature-color-dark;\n}\n\n.banner {\n border-bottom-color: $text-color-primary-dark;\n background-color: rgba(0, 0, 0, 0.8);\n\n .blog-title {\n a {\n color: $header-banner-text-color-dark;\n &:hover {\n color: $feature-color-dark;\n }\n }\n }\n\n .post-title {\n a {\n color: $header-banner-text-color-dark;\n }\n }\n\n &.banner-clean {\n background-color: rgba(0, 0, 0, 0.9);\n }\n}\n\n.header-sidebar-menu {\n border-color: $body-background-color;\n color: $body-background-color;\n &:hover {\n background-color: $body-background-color;\n color: #000;\n }\n}\n\n.header-sidebar-menu-rounded {\n &:hover {\n background-color: transparent;\n color: $feature-color-dark;\n }\n}\n\n.header-sidebar-menu-black {\n color: $text-color-primary-dark;\n background-color: $body-background-color-dark;\n border-color: $text-color-primary-dark;\n &:hover {\n background-color: $text-color-primary-dark;\n color: $body-background-color-dark;\n }\n}\n\n.header-actions {\n .home-link {\n a {\n &:hover {\n color: $feature-color-dark;\n }\n }\n }\n}\n",".profile {\n color: $social-iconfont-color-dark;\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.profile-avatar {\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.profile-name {\n color: #ddd;\n}\n\n.profile-social {\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.friends {\n border-color: rgba(255, 255, 255, 0.1);\n\n a {\n color: $social-iconfont-color-dark;\n &:hover {\n color: $feature-color-dark;\n }\n }\n}\n\n.profile-link-item {\n border-color: rgba(255, 255, 255, 0.1);\n\n a {\n color: $social-iconfont-color-dark;\n &:hover {\n color: $feature-color-dark;\n }\n }\n}\n",".popup {\n background: $body-background-color-dark;\n color: #e1e1e1;\n box-shadow: 0px 0px 10px rgba(255, 255, 255, 0.5);\n}\n\n.algolia-search {\n border-bottom-color: #222;\n background-color: $foreground-color-dark;\n}\n\n.algolia-search-input input {\n color: $text-color-primary-dark;\n}\n\n.algolia-hit-item {\n &:hover {\n border-bottom: 1px solid;\n background-color: $foreground-color-dark;\n }\n}\n\n.algolia-hit-item-link {\n color: $text-color-primary-dark;\n}\n\n.popup-btn-close {\n color: $feature-color-dark;\n}\n\n.algolia-hit {\n &-item {\n &-link {\n em {\n color: $feature-color-dark;\n }\n }\n }\n}\n\n.ais-Pagination-item {\n a {\n color: $feature-color-dark;\n }\n}\n",".abstract-content,\n.article-entry {\n code {\n background: #282c34;\n }\n}\n",".archive-post-item {\n &:hover {\n border-left-color: $feature-color-dark;\n .archive-post-date,\n .archive-post-title {\n color: $feature-color-dark;\n }\n }\n}\n\n.site-search {\n .search-icon {\n color: $feature-color-dark;\n }\n}\n\n.archive-year,\n.total-archive {\n color: $feature-color-dark;\n}\n",".sidebar-tag-name,\n.sidebar-category-name {\n &:hover {\n border-color: $feature-color-dark;\n color: $feature-color-dark;\n }\n}\n\n.sidebar-label-focus {\n border-color: $feature-color-dark;\n color: $feature-color-dark;\n}\n",".sidebar-tabs {\n &::after {\n background-color: $feature-color-dark;\n }\n}\n",".index-post {\n background-color: $foreground-color-dark;\n margin-bottom: 1rem;\n}\n\n.index-post {\n .abstract-content {\n color: $abstract-content-text-color-dark;\n }\n}\n\n.abstract-title {\n color: $abstract-content-title-color-dark;\n\n &:hover {\n color: $feature-color-dark;\n }\n}\n\n.index-post {\n .abstract-read-more-button {\n a {\n color: $abstract-post-meta-color-dark;\n &:hover {\n color: $feature-color-dark;\n }\n }\n }\n}\n\n.abstract-post-meta {\n color: $abstract-post-meta-color-dark;\n\n a {\n color: $abstract-post-meta-color-dark;\n }\n\n .post-tag {\n @include hover-line($color: $abstract-post-meta-color-dark);\n }\n}\n\n.index-post-divider {\n display: none;\n}\n","// ========== hover ========== //\n@mixin hover-line($height: 2px, $width: 98%, $color: $feature-color) {\n &::after {\n content: '';\n position: absolute;\n left: calc((100% - #{$width}) / 2);\n bottom: -15%;\n transition: all 0.15s ease-in;\n width: $width;\n height: $height;\n transform: translate(0, 0);\n background-color: $color;\n opacity: 0;\n }\n &:hover::after {\n transform: translate(0, -2px);\n opacity: 1;\n }\n}\n\n// ========== social style ========== //\n@mixin social($scaleSize, $spanMargin) {\n .iconfont-archer {\n display: inline-block;\n text-align: center;\n }\n .iconfont-archer::before {\n display: inline-block;\n color: $social-iconfont-color;\n font-size: 3rem * $scaleSize;\n margin: 0 $spanMargin 0 0;\n }\n .iconfont-archer:last-of-child::before {\n margin: 0;\n }\n .email {\n top: 4px * $scaleSize;\n &::before {\n content: '\\e642';\n }\n &:hover::before {\n color: #0cb49d;\n }\n }\n .github {\n &::before {\n font-size: 3.2rem * $scaleSize;\n content: '\\e69f';\n }\n &:hover::before {\n color: #24292e;\n }\n }\n .wechat {\n top: 4px * $scaleSize;\n &::before {\n font-size: 2.8rem * $scaleSize;\n content: '\\ec7d';\n }\n &:hover::before {\n color: #42ae3c;\n }\n }\n .qq {\n top: 4px * $scaleSize;\n &::before {\n font-size: 2.8rem * $scaleSize;\n content: '\\e61d';\n }\n &:hover::before {\n color: #4f4e71;\n }\n }\n .telegram {\n top: 2.5px * $scaleSize;\n &::before {\n font-size: 2.6rem * $scaleSize;\n content: '\\e731';\n }\n &:hover::before {\n color: #36a1d3;\n }\n }\n .weibo {\n &::before {\n font-size: 3.2rem * $scaleSize;\n content: '\\e619';\n }\n &:hover::before {\n color: #d52a2a;\n }\n }\n .zhihu {\n top: 3px * $scaleSize;\n &::before {\n font-size: 2.7rem * $scaleSize;\n content: '\\e61a';\n }\n &:hover::before {\n color: #0f88eb;\n }\n }\n .douban {\n top: 2px * $scaleSize;\n &::before {\n font-size: 2.5rem * $scaleSize;\n content: '\\e605';\n }\n &:hover::before {\n color: #007711;\n }\n }\n .facebook {\n top: 5px * $scaleSize;\n &::before {\n font-size: 3rem * $scaleSize;\n content: '\\e67a';\n }\n &:hover::before {\n color: #3b5998;\n }\n }\n .twitter {\n top: 2px * $scaleSize;\n &::before {\n content: '\\e634';\n }\n &:hover::before {\n color: #1da1f2;\n }\n }\n .instagram {\n top: 4px * $scaleSize;\n &::before {\n content: '\\e79d';\n font-size: 2.8rem * $scaleSize;\n }\n &:hover::before {\n color: #8042b6;\n }\n }\n .stack-overflow {\n top: 1px * $scaleSize;\n &::before {\n font-size: 2.3rem * $scaleSize;\n content: '\\e80b';\n }\n &:hover::before {\n color: #f37f23;\n }\n }\n .segmentFault {\n top: 4px * $scaleSize;\n &::before {\n font-size: 3rem * $scaleSize;\n content: '\\e60c';\n }\n &:hover::before {\n color: #f37f23;\n }\n }\n .juejin {\n top: 1px * $scaleSize;\n &::before {\n font-size: 2.7rem * $scaleSize;\n content: '\\e60b';\n }\n &:hover::before {\n color: #f37f23;\n }\n }\n .v2ex {\n &::before {\n font-size: 2.2rem * $scaleSize;\n content: '\\e663';\n }\n &:hover::before {\n color: #171718;\n }\n }\n .bilibili {\n top: 6px * $scaleSize;\n &::before {\n font-size: 3.5rem * $scaleSize;\n content: '\\e64e';\n }\n &:hover::before {\n color: #2cb2f9;\n }\n }\n .linkedin {\n top: -1px * $scaleSize;\n &::before {\n font-size: 2.5rem * $scaleSize;\n content: '\\e695';\n }\n &:hover::before {\n color: #0077b5;\n }\n }\n .steam {\n top: 2px * $scaleSize;\n &::before {\n font-size: 2.5rem * $scaleSize;\n content: '\\f23b';\n }\n &:hover::before {\n color: #010101;\n }\n }\n .others {\n top: -1px * $scaleSize;\n &::before {\n font-size: 2.2rem * $scaleSize;\n content: '\\e64a';\n }\n &:hover::before {\n color: #8090b0;\n }\n }\n .rss {\n &::before {\n font-size: 2.1rem * $scaleSize;\n content: '\\e652';\n }\n &:hover::before {\n color: #e53935;\n }\n }\n}\n",".anchorjs-archer {\n color: $feature-color-dark;\n}\n\n.article-entry {\n background-color: $foreground-color-dark;\n}\n\n.abstract-content,\n.article-entry {\n color: $post-content-color-dark;\n blockquote {\n background-color: #1e1e1e;\n border-left-color: $feature-color-dark;\n }\n .table-container table,\n > table {\n border-color: #1e1e1e;\n box-shadow: 2px 2px 2px rgba(255, 255, 255, 0.125);\n thead {\n tr {\n background: #1e1e1e;\n }\n }\n tbody {\n tr:hover {\n background: #242424;\n }\n }\n td,\n th {\n border-color: #2a2a2a;\n }\n }\n a {\n color: $feature-color-dark;\n &:hover {\n border-bottom-color: $feature-color-dark;\n }\n }\n}\n\n.license-wrapper {\n background-color: $foreground-color-dark;\n}\n\n.license-wrapper {\n color: $post-content-color-dark;\n a {\n color: $feature-color-dark;\n }\n}\n\n.toc-wrapper {\n .toc-active {\n color: $feature-color-dark;\n }\n a {\n color: #777;\n }\n a:hover {\n color: $feature-color-dark;\n }\n}\n\n.toc-catalog {\n &:hover {\n color: $feature-color-dark;\n }\n}\n\n.post-paginator {\n .nextTitle,\n .prevTitle {\n color: $text-color-minor-dark;\n &:hover {\n color: $feature-color-dark;\n }\n }\n\n .nextSlogan,\n .prevSlogan {\n color: $text-color-secondary-dark;\n }\n}\n","$gt-color-main: $feature-color-dark;\n$gt-color-main-lighter: lighten($gt-color-main, 20%);\n$gt-color-btn: #ffffff;\n\n#gitalk-container {\n * {\n color: $post-content-color-dark;\n }\n\n textarea,\n .gt-header-preview *,\n .gt-comment-content *,\n .gt-action *,\n .gt-version {\n color: #333;\n }\n\n a {\n color: $gt-color-main !important;\n &:hover {\n color: $gt-color-main-lighter !important;\n border-color: $gt-color-main-lighter !important;\n }\n }\n\n .gt-svg svg {\n fill: $gt-color-main !important;\n }\n\n .gt-spinner::before {\n border-color: $gt-color-btn !important;\n border-top-color: $gt-color-main !important;\n }\n\n .gt-btn {\n background-color: $gt-color-main !important;\n border-color: $gt-color-main !important;\n color: $gt-color-btn !important;\n &-login {\n &:hover {\n background-color: $gt-color-main-lighter !important;\n border-color: $gt-color-main-lighter !important;\n }\n }\n &-preview {\n background-color: $gt-color-btn !important;\n color: $gt-color-main !important;\n &:hover {\n background-color: darken($gt-color-btn, 5%) !important;\n border-color: $gt-color-main-lighter !important;\n }\n .gt-btn-text {\n color: $gt-color-main !important;\n }\n }\n &-public {\n &:hover {\n background-color: $gt-color-main-lighter !important;\n border-color: $gt-color-main-lighter !important;\n }\n }\n }\n\n .gt-link {\n border-bottom-color: $gt-color-main !important;\n }\n\n .gt-user .is--poping .gt-ico svg {\n fill: $gt-color-main !important;\n }\n\n .gt-popup .gt-action.is--active:before {\n background: $gt-color-main !important;\n }\n\n .gt-header-controls-tip {\n color: $gt-color-main !important;\n }\n\n .gt-comment-username {\n color: $gt-color-main !important;\n }\n}\n"]} \ No newline at end of file diff --git a/css/mobile.css b/css/mobile.css new file mode 100644 index 000000000..279ec1562 --- /dev/null +++ b/css/mobile.css @@ -0,0 +1,7 @@ +:root{--base-font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Arial, + 'PingFang SC', 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei', + 'Microsoft JhengHei', 'Source Han Sans SC', 'Noto Sans CJK SC', + 'Source Han Sans CN', 'Noto Sans SC', 'Source Han Sans TC', + 'Noto Sans CJK TC', 'WenQuanYi Micro Hei', SimSun, sans-serif}@font-face{font-family:'iconfont-archer';src:url("//at.alicdn.com/t/font_327081_s1wbjxwfu9c.eot");src:url("//at.alicdn.com/t/font_327081_s1wbjxwfu9c.eot?#iefix") format("embedded-opentype"),url("//at.alicdn.com/t/font_327081_s1wbjxwfu9c.woff") format("woff"),url("//at.alicdn.com/t/font_327081_s1wbjxwfu9c.ttf") format("truetype"),url("//at.alicdn.com/t/font_327081_s1wbjxwfu9c.svg#iconfont-archer") format("svg")}.iconfont-archer{font-family:'iconfont-archer' !important;font-size:1rem;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.index-post .abstract-read-more-button a{justify-content:center;padding-bottom:1rem}.archer-float-left,.archer-float-right{float:unset;margin:unset}.meta-post-item{flex-direction:column}.meta-post-title{margin-left:0;padding:0.5rem 0}.container{flex-direction:column-reverse;margin:0 auto;width:100%;padding:1rem 0 0 0;align-items:center}.profile{margin:1rem auto 0.5rem auto;padding:0 0}.profile .profile-avatar{width:60%;margin:0 auto}.profile .profile-social{display:none}.toc-wrapper{display:none}.footer{padding-top:0}.post-page{padding-bottom:0}.post-paginator .nextTitle,.post-paginator .prevTitle{font-size:1rem}.post-paginator .nextSlogan,.post-paginator .prevSlogan{font-size:1.2rem}.main{width:92%;min-width:0;margin:0}*{-webkit-tap-highlight-color:transparent}.home-body .site-intro-meta{width:100%}.home-body .intro-title{font-size:3rem;line-height:3.4rem;max-width:80%}.home-body .intro-subtitle{font-size:1.5rem;margin-top:0.5rem;white-space:normal;max-width:90%}.about-body .site-intro-meta,.post-body .site-intro-meta{min-width:0;width:80%}.about-body .intro-title,.post-body .intro-title{font-size:2.6rem;line-height:3rem;max-width:100%}.about-body .intro-subtitle,.post-body .intro-subtitle{font-size:1.5rem;white-space:normal;max-width:100%}.about-body .main,.post-body .main{width:95%}header.header{height:3rem}header.header-mobile{background-color:rgba(0,0,0,0.38)}header .banner .post-title{display:none}header .banner .blog-title{line-height:2rem}header .home-link{right:1rem;line-height:2rem}header .header-sidebar-menu{width:2rem;height:2rem;line-height:2rem}header .header-sidebar-menu-rounded{width:2.5rem;height:2.5rem;line-height:2.5rem}.back-top{width:2rem;height:2rem;line-height:2rem}.back-top-rounded{width:2.5rem;height:2.5rem;line-height:2.5rem}.post-paginator li{max-width:45%}.post-paginator .previous,.post-paginator .next{float:none}.article-entry blockquote{padding:1rem}.about-page .article-entry{margin-bottom:2rem}.sidebar{width:calc(min(400px, 70vw))}.wrapper-sidebar-active{transform:translate3d(calc(min(400px, 70vw)), 0, 0)}header.header-sidebar-active{transform:translate3d(calc(min(400px, 70vw)), 0, 0)}.footer-fixed-sidebar-active{transform:translate3d(calc(min(400px, 70vw)), 0, 0)}.tab-name{font-size:1.2rem}.sidebar-archive{-webkit-overflow-scrolling:touch}.total-archive{font-size:1.4rem}.archive-year{font-size:1.2rem;margin:0.5rem 0 0.5rem 0}.sidebar-tags{-webkit-overflow-scrolling:touch}.post-comment{margin:1.5rem 0 2rem 0}.footer{margin-top:0}.footer .social{width:200px;line-height:2rem;min-width:unset}.footer .social .iconfont-archer{display:inline-block;text-align:center}.footer .social .iconfont-archer::before{display:inline-block;color:#777;font-size:1.5rem;margin:0 .2rem 0 0}.footer .social .iconfont-archer:last-of-child::before{margin:0}.footer .social .email{top:2px}.footer .social .email::before{content:'\e642'}.footer .social .email:hover::before{color:#0cb49d}.footer .social .github::before{font-size:1.6rem;content:'\e69f'}.footer .social .github:hover::before{color:#24292e}.footer .social .wechat{top:2px}.footer .social .wechat::before{font-size:1.4rem;content:'\ec7d'}.footer .social .wechat:hover::before{color:#42ae3c}.footer .social .qq{top:2px}.footer .social .qq::before{font-size:1.4rem;content:'\e61d'}.footer .social .qq:hover::before{color:#4f4e71}.footer .social .telegram{top:1.25px}.footer .social .telegram::before{font-size:1.3rem;content:'\e731'}.footer .social .telegram:hover::before{color:#36a1d3}.footer .social .weibo::before{font-size:1.6rem;content:'\e619'}.footer .social .weibo:hover::before{color:#d52a2a}.footer .social .zhihu{top:1.5px}.footer .social .zhihu::before{font-size:1.35rem;content:'\e61a'}.footer .social .zhihu:hover::before{color:#0f88eb}.footer .social .douban{top:1px}.footer .social .douban::before{font-size:1.25rem;content:'\e605'}.footer .social .douban:hover::before{color:#007711}.footer .social .facebook{top:2.5px}.footer .social .facebook::before{font-size:1.5rem;content:'\e67a'}.footer .social .facebook:hover::before{color:#3b5998}.footer .social .twitter{top:1px}.footer .social .twitter::before{content:'\e634'}.footer .social .twitter:hover::before{color:#1da1f2}.footer .social .instagram{top:2px}.footer .social .instagram::before{content:'\e79d';font-size:1.4rem}.footer .social .instagram:hover::before{color:#8042b6}.footer .social .stack-overflow{top:.5px}.footer .social .stack-overflow::before{font-size:1.15rem;content:'\e80b'}.footer .social .stack-overflow:hover::before{color:#f37f23}.footer .social .segmentFault{top:2px}.footer .social .segmentFault::before{font-size:1.5rem;content:'\e60c'}.footer .social .segmentFault:hover::before{color:#f37f23}.footer .social .juejin{top:.5px}.footer .social .juejin::before{font-size:1.35rem;content:'\e60b'}.footer .social .juejin:hover::before{color:#f37f23}.footer .social .v2ex::before{font-size:1.1rem;content:'\e663'}.footer .social .v2ex:hover::before{color:#171718}.footer .social .bilibili{top:3px}.footer .social .bilibili::before{font-size:1.75rem;content:'\e64e'}.footer .social .bilibili:hover::before{color:#2cb2f9}.footer .social .linkedin{top:-.5px}.footer .social .linkedin::before{font-size:1.25rem;content:'\e695'}.footer .social .linkedin:hover::before{color:#0077b5}.footer .social .steam{top:1px}.footer .social .steam::before{font-size:1.25rem;content:'\f23b'}.footer .social .steam:hover::before{color:#010101}.footer .social .others{top:-.5px}.footer .social .others::before{font-size:1.1rem;content:'\e64a'}.footer .social .others:hover::before{color:#8090b0}.footer .social .rss::before{font-size:1.05rem;content:'\e652'}.footer .social .rss:hover::before{color:#e53935}.note{padding:0.5rem 1rem} + +/*# sourceMappingURL=mobile.css.map */ diff --git a/css/mobile.css.map b/css/mobile.css.map new file mode 100644 index 000000000..1c2f88847 --- /dev/null +++ b/css/mobile.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["_variables.scss","_mobile/_partial/_index-page-mobile.scss","_mobile/_partial/_post/_writing-enhance-mobile.scss","_mobile/_partial/_sidebar/_sidebar-tags-mobile.scss","mobile.scss","_mixin.scss"],"names":[],"mappings":"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","file":"mobile.css","sourcesContent":["// You can change the following settings by yourself :-)\n\n:root {\n --base-font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Arial,\n 'PingFang SC', 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei',\n 'Microsoft JhengHei', 'Source Han Sans SC', 'Noto Sans CJK SC',\n 'Source Han Sans CN', 'Noto Sans SC', 'Source Han Sans TC',\n 'Noto Sans CJK TC', 'WenQuanYi Micro Hei', SimSun, sans-serif;\n}\n\n// ========== DIY ========== //\n$feature-color: #f75357;\n$feature-color-dark: #f75357; // Feature color in dark mode\n$code-theme: 'atom-one-dark'; // atom-one-dark or atom-one-light\n\n// ========== global variables ========== //\n$body-background-color: #fff;\n$foreground-color: #fdfdfd;\n$body-background-color-dark: #121212;\n$foreground-color-dark: #181818;\n$base-font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Arial,\n 'PingFang SC', 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei',\n 'Microsoft JhengHei', 'Source Han Sans SC', 'Noto Sans CJK SC',\n 'Source Han Sans CN', 'Noto Sans SC', 'Source Han Sans TC', 'Noto Sans CJK TC',\n 'WenQuanYi Micro Hei', SimSun, sans-serif;\n$feature-font-family: 'Oswald-Regular', $base-font-family;\n$base-font-size: 16px !default;\n\n// ========== CSS Variables ========== //\n$base-font-family: var(--base-font-family);\n\n// ========== common ========== //\n$container-margin-top: 3rem;\n$selection-background-color: $feature-color;\n$selection-background-color-dark: $feature-color-dark;\n$selection-text-color: #eee;\n$selection-text-color-dark: snow;\n\n// ========= dark mode ========= //\n$text-color-primary-dark: rgba(255, 255, 255, 0.87);\n$text-color-secondary-dark: rgba(255, 255, 255, 0.6);\n$text-color-minor-dark: rgba(255, 255, 255, 0.38);\n$transition-animation: all 0.5s ease-out;\n\n// ========== iconfont ========== //\n@font-face {\n font-family: 'iconfont-archer'; /* project id 327081 */\n src: url('//at.alicdn.com/t/font_327081_s1wbjxwfu9c.eot');\n src: url('//at.alicdn.com/t/font_327081_s1wbjxwfu9c.eot?#iefix')\n format('embedded-opentype'),\n url('//at.alicdn.com/t/font_327081_s1wbjxwfu9c.woff') format('woff'),\n url('//at.alicdn.com/t/font_327081_s1wbjxwfu9c.ttf') format('truetype'),\n url('//at.alicdn.com/t/font_327081_s1wbjxwfu9c.svg#iconfont-archer')\n format('svg');\n}\n\n.iconfont-archer {\n font-family: 'iconfont-archer' !important;\n font-size: 1rem;\n font-style: normal;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// ======= fixed footer ======= //\n$footer-fixed-height: 3.5rem;\n\n// ========== header ========== //\n$header-height: 3.5rem;\n$header-height-mobile: 3rem;\n$header-border-top-width: 3px;\n$header-border-top-color: rgba(0, 0, 0, 0.75);\n$header-border-top-color-dark: rgba(0, 0, 0, 0.75);\n$header-banner-text-color: #333;\n$header-banner-text-color-dark: $text-color-primary-dark;\n\n// ========= sidebar ========= //\n$sidebar-width: 400px;\n\n// ========== profile ========== //\n$profile-width: 200px;\n\n// ========== index ========== //\n$index-post-link-color: #1f1f1f;\n$index-post-link-color-dark: #ccc;\n$index-post-tag-color: #aaa;\n$index-post-tag-color-dark: $text-color-minor-dark;\n\n// ===== abstract content ===== //\n$abstract-content-title-color: #333;\n$abstract-content-title-color-dark: $text-color-primary-dark;\n$abstract-content-text-color: #585858;\n$abstract-content-text-color-dark: $text-color-secondary-dark;\n$abstract-post-meta-color: #aaa;\n$abstract-post-meta-color-dark: $text-color-minor-dark;\n\n// ========== post ========== //\n$post-content-color: #23394d;\n$post-content-color-dark: $text-color-primary-dark;\n\n// ========== social ========== //\n$social-iconfont-color: #777;\n$social-iconfont-color-dark: #777;\n\n// ========== code ========== //\n$code-color-map: (\n 'atom-one-light': (\n base: #fafafa,\n mono-1: #383a42,\n mono-2: #686b77,\n mono-3: #a0a1a7,\n hue-1: #0184bb,\n hue-2: #4078f2,\n hue-3: #a626a4,\n hue-4: #50a14f,\n hue-5: #e45649,\n hue-5-2: #c91243,\n hue-6: #986801,\n hue-6-2: #c18401,\n ),\n 'atom-one-dark': (\n base: #282c34,\n mono-1: #abb2bf,\n mono-2: #818896,\n mono-3: #5c6370,\n hue-1: #56b6c2,\n hue-2: #61aeee,\n hue-3: #c678dd,\n hue-4: #98c379,\n hue-5: #e06c75,\n hue-5-2: #be5046,\n hue-6: #d19a66,\n hue-6-2: #e6c07b,\n ),\n);\n@if not(map-has-key($code-color-map, $code-theme)) {\n $code-theme: 'atom-one-dark';\n}\n$theme-colors: map-get($code-color-map, $code-theme);\n\n// ========== algolia-search ========== //\n$algolia-search-padding-horiz: 20px;\n",".index-post {\n .abstract-read-more-button {\n a {\n justify-content: center;\n padding-bottom: 1rem;\n }\n }\n}\n",".archer- {\n &float-left,\n &float-right {\n float: unset;\n margin: unset;\n }\n}\n",".meta-post-item {\n flex-direction: column;\n}\n\n.meta-post-title {\n margin-left: 0;\n padding: 0.5rem 0;\n}\n","@import '_mixin';\n@import '_variables';\n\n@import '_mobile/_partial/index-page-mobile';\n@import '_mobile/_partial/_post/writing-enhance-mobile';\n@import '_mobile/_partial/_sidebar/sidebar-tags-mobile';\n\n// ========== common ========== //\n.container {\n flex-direction: column-reverse;\n margin: 0 auto;\n width: 100%;\n padding: 1rem 0 0 0;\n align-items: center;\n}\n\n.profile {\n margin: 1rem auto 0.5rem auto;\n padding: 0 0;\n .profile-avatar {\n width: 60%;\n margin: 0 auto;\n }\n .profile-social {\n display: none;\n }\n}\n\n.toc-wrapper {\n display: none;\n}\n\n.footer {\n padding-top: 0;\n}\n\n.post-page {\n padding-bottom: 0;\n}\n\n.post-paginator {\n .nextTitle,\n .prevTitle {\n font-size: 1rem;\n }\n\n .nextSlogan,\n .prevSlogan {\n font-size: 1.2rem;\n }\n}\n\n.main {\n width: 92%;\n min-width: 0;\n margin: 0;\n}\n\n// prevent blink when touch link\n* {\n -webkit-tap-highlight-color: transparent;\n}\n\n// ========== intro ========== //\n.home-body {\n .site-intro-meta {\n width: 100%;\n }\n .intro-title {\n font-size: 3rem;\n line-height: 3.4rem;\n max-width: 80%;\n }\n .intro-subtitle {\n font-size: 1.5rem;\n margin-top: 0.5rem;\n white-space: normal;\n max-width: 90%;\n }\n}\n\n.about-body,\n.post-body {\n .site-intro-meta {\n min-width: 0;\n width: 80%;\n }\n .intro-title {\n font-size: 2.6rem;\n line-height: 3rem;\n max-width: 100%;\n }\n .intro-subtitle {\n font-size: 1.5rem;\n white-space: normal;\n max-width: 100%;\n }\n .main {\n width: 95%;\n }\n}\n\n// ========== header ========== //\nheader {\n &.header {\n height: $header-height-mobile;\n }\n\n &.header-mobile {\n background-color: rgba(0, 0, 0, 0.38);\n }\n\n .banner {\n .post-title {\n display: none;\n }\n\n .blog-title {\n line-height: 2rem;\n }\n }\n\n .home-link {\n right: 1rem;\n line-height: 2rem;\n }\n\n .header-sidebar-menu {\n width: 2rem;\n height: 2rem;\n line-height: 2rem;\n }\n\n .header-sidebar-menu-rounded {\n width: 2.5rem;\n height: 2.5rem;\n line-height: 2.5rem;\n }\n}\n\n// ========== fixed footer ========== //\n.back-top {\n width: 2rem;\n height: 2rem;\n line-height: 2rem;\n}\n\n.back-top-rounded {\n width: 2.5rem;\n height: 2.5rem;\n line-height: 2.5rem;\n}\n\n// ========== content ========== //\n.post-paginator {\n li {\n max-width: 45%;\n }\n\n .previous,\n .next {\n float: none;\n }\n}\n\n.article-entry {\n blockquote {\n padding: 1rem;\n }\n}\n\n.about-page {\n .article-entry {\n margin-bottom: 2rem;\n }\n}\n\n// ========== sidebar ========== //\n// $sidebar-width: 400px;\n.sidebar {\n width: calc(min(400px, 70vw));\n}\n\n.wrapper-sidebar-active {\n transform: translate3d(calc(min(400px, 70vw)), 0, 0);\n}\n\nheader.header-sidebar-active {\n transform: translate3d(calc(min(400px, 70vw)), 0, 0);\n}\n\n.footer-fixed-sidebar-active {\n transform: translate3d(calc(min(400px, 70vw)), 0, 0);\n}\n\n.tab-name {\n font-size: 1.2rem;\n}\n\n.sidebar-archive {\n -webkit-overflow-scrolling: touch;\n}\n\n.total-archive {\n font-size: 1.4rem;\n}\n\n.archive-year {\n font-size: 1.2rem;\n margin: 0.5rem 0 0.5rem 0;\n}\n\n.sidebar-tags {\n -webkit-overflow-scrolling: touch;\n}\n\n// ========== comment ========== //\n.post-comment {\n margin: 1.5rem 0 2rem 0;\n}\n\n// ========== footer ========== //\n.footer {\n margin-top: 0;\n .social {\n width: 200px;\n line-height: 2rem;\n min-width: unset;\n @include social($scaleSize: 0.5, $spanMargin: 0.2rem);\n }\n}\n\n// ========== note ========== //\n.note {\n padding: 0.5rem 1rem;\n}\n","// ========== hover ========== //\n@mixin hover-line($height: 2px, $width: 98%, $color: $feature-color) {\n &::after {\n content: '';\n position: absolute;\n left: calc((100% - #{$width}) / 2);\n bottom: -15%;\n transition: all 0.15s ease-in;\n width: $width;\n height: $height;\n transform: translate(0, 0);\n background-color: $color;\n opacity: 0;\n }\n &:hover::after {\n transform: translate(0, -2px);\n opacity: 1;\n }\n}\n\n// ========== social style ========== //\n@mixin social($scaleSize, $spanMargin) {\n .iconfont-archer {\n display: inline-block;\n text-align: center;\n }\n .iconfont-archer::before {\n display: inline-block;\n color: $social-iconfont-color;\n font-size: 3rem * $scaleSize;\n margin: 0 $spanMargin 0 0;\n }\n .iconfont-archer:last-of-child::before {\n margin: 0;\n }\n .email {\n top: 4px * $scaleSize;\n &::before {\n content: '\\e642';\n }\n &:hover::before {\n color: #0cb49d;\n }\n }\n .github {\n &::before {\n font-size: 3.2rem * $scaleSize;\n content: '\\e69f';\n }\n &:hover::before {\n color: #24292e;\n }\n }\n .wechat {\n top: 4px * $scaleSize;\n &::before {\n font-size: 2.8rem * $scaleSize;\n content: '\\ec7d';\n }\n &:hover::before {\n color: #42ae3c;\n }\n }\n .qq {\n top: 4px * $scaleSize;\n &::before {\n font-size: 2.8rem * $scaleSize;\n content: '\\e61d';\n }\n &:hover::before {\n color: #4f4e71;\n }\n }\n .telegram {\n top: 2.5px * $scaleSize;\n &::before {\n font-size: 2.6rem * $scaleSize;\n content: '\\e731';\n }\n &:hover::before {\n color: #36a1d3;\n }\n }\n .weibo {\n &::before {\n font-size: 3.2rem * $scaleSize;\n content: '\\e619';\n }\n &:hover::before {\n color: #d52a2a;\n }\n }\n .zhihu {\n top: 3px * $scaleSize;\n &::before {\n font-size: 2.7rem * $scaleSize;\n content: '\\e61a';\n }\n &:hover::before {\n color: #0f88eb;\n }\n }\n .douban {\n top: 2px * $scaleSize;\n &::before {\n font-size: 2.5rem * $scaleSize;\n content: '\\e605';\n }\n &:hover::before {\n color: #007711;\n }\n }\n .facebook {\n top: 5px * $scaleSize;\n &::before {\n font-size: 3rem * $scaleSize;\n content: '\\e67a';\n }\n &:hover::before {\n color: #3b5998;\n }\n }\n .twitter {\n top: 2px * $scaleSize;\n &::before {\n content: '\\e634';\n }\n &:hover::before {\n color: #1da1f2;\n }\n }\n .instagram {\n top: 4px * $scaleSize;\n &::before {\n content: '\\e79d';\n font-size: 2.8rem * $scaleSize;\n }\n &:hover::before {\n color: #8042b6;\n }\n }\n .stack-overflow {\n top: 1px * $scaleSize;\n &::before {\n font-size: 2.3rem * $scaleSize;\n content: '\\e80b';\n }\n &:hover::before {\n color: #f37f23;\n }\n }\n .segmentFault {\n top: 4px * $scaleSize;\n &::before {\n font-size: 3rem * $scaleSize;\n content: '\\e60c';\n }\n &:hover::before {\n color: #f37f23;\n }\n }\n .juejin {\n top: 1px * $scaleSize;\n &::before {\n font-size: 2.7rem * $scaleSize;\n content: '\\e60b';\n }\n &:hover::before {\n color: #f37f23;\n }\n }\n .v2ex {\n &::before {\n font-size: 2.2rem * $scaleSize;\n content: '\\e663';\n }\n &:hover::before {\n color: #171718;\n }\n }\n .bilibili {\n top: 6px * $scaleSize;\n &::before {\n font-size: 3.5rem * $scaleSize;\n content: '\\e64e';\n }\n &:hover::before {\n color: #2cb2f9;\n }\n }\n .linkedin {\n top: -1px * $scaleSize;\n &::before {\n font-size: 2.5rem * $scaleSize;\n content: '\\e695';\n }\n &:hover::before {\n color: #0077b5;\n }\n }\n .steam {\n top: 2px * $scaleSize;\n &::before {\n font-size: 2.5rem * $scaleSize;\n content: '\\f23b';\n }\n &:hover::before {\n color: #010101;\n }\n }\n .others {\n top: -1px * $scaleSize;\n &::before {\n font-size: 2.2rem * $scaleSize;\n content: '\\e64a';\n }\n &:hover::before {\n color: #8090b0;\n }\n }\n .rss {\n &::before {\n font-size: 2.1rem * $scaleSize;\n content: '\\e652';\n }\n &:hover::before {\n color: #e53935;\n }\n }\n}\n"]} \ No newline at end of file diff --git a/css/style.css b/css/style.css new file mode 100644 index 000000000..597a1f437 --- /dev/null +++ b/css/style.css @@ -0,0 +1,7 @@ +:root{--base-font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Arial, + 'PingFang SC', 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei', + 'Microsoft JhengHei', 'Source Han Sans SC', 'Noto Sans CJK SC', + 'Source Han Sans CN', 'Noto Sans SC', 'Source Han Sans TC', + 'Noto Sans CJK TC', 'WenQuanYi Micro Hei', SimSun, sans-serif}@font-face{font-family:'iconfont-archer';src:url("//at.alicdn.com/t/font_327081_s1wbjxwfu9c.eot");src:url("//at.alicdn.com/t/font_327081_s1wbjxwfu9c.eot?#iefix") format("embedded-opentype"),url("//at.alicdn.com/t/font_327081_s1wbjxwfu9c.woff") format("woff"),url("//at.alicdn.com/t/font_327081_s1wbjxwfu9c.ttf") format("truetype"),url("//at.alicdn.com/t/font_327081_s1wbjxwfu9c.svg#iconfont-archer") format("svg")}.iconfont-archer{font-family:'iconfont-archer' !important;font-size:1rem;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}/*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type='checkbox'],input[type='radio']{box-sizing:border-box;padding:0}input[type='number']::-webkit-inner-spin-button,input[type='number']::-webkit-outer-spin-button{height:auto}input[type='searcher']{-webkit-appearance:textfield;box-sizing:content-box}input[type='searcher']::-webkit-searcher-cancel-button,input[type='searcher']::-webkit-searcher-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{font-size:16px;font-family:var(--base-font-family);overflow-x:hidden}*{font-family:inherit}body{z-index:100;position:relative;background-color:#fff;transition:all 0.5s ease-out}.wrapper{z-index:1;display:flex;flex-direction:column;width:100%;min-height:100%;transition:transform 0.3s ease-in;transform:translate3d(0, 0, 0);position:relative;box-shadow:-3px 0 2px 0 rgba(0,0,0,0.6)}.wrapper-sidebar-active{transform:translate3d(400px, 0, 0)}.main{order:1;width:50%;min-width:42.8125rem;flex-grow:0;padding:0 0 0 0;margin-left:3rem}.container{display:flex;padding:3rem 0 0 0;position:relative;background-color:#fff;top:0;left:0;align-items:flex-start;justify-content:center;width:100%;transition:all 0.5s ease-out;opacity:1;transform:translate3d(0, 0, 0)}.container-unloaded{opacity:0;transform:translate3d(0, 1rem, 0)}a{text-decoration:none}ul,li{list-style-type:none}::-moz-selection{background:#f75357;color:#eee}::selection{background:#f75357;color:#eee}.fancy-link{padding:0 !important;margin:0 !important}.note{margin:1.5rem 0;padding:1rem 1.5rem;border-left:0.35rem solid;border-radius:0.35rem;transition:all 0.5s ease-out}.note .title{font-weight:bold;margin-top:1rem}.note.note-warning{background-color:#fdf8ea;border-color:#f0ad4e}.footer-fixed{position:fixed;bottom:0;width:100%;height:3.5rem;overflow:hidden;z-index:10;transform:translate3d(0, 0, 0);transition:transform 0.3s ease-in 0s;pointer-events:none}.footer-fixed-element{pointer-events:auto}.footer-fixed-sidebar-active{transform:translate3d(400px, 0, 0)}.back-top{position:fixed;display:block;top:50%;transform:translate(0, -50%);transition:all 0.3s ease;font-family:'iconfont-archer';left:1rem;bottom:1rem;z-index:21;width:1.5rem;height:1.5rem;text-align:center;line-height:1.5rem;border:2px solid #121212;background-color:#fff;cursor:pointer}.back-top:hover{background-color:#121212;color:#fff}.back-top-rounded{position:absolute;font-family:'iconfont-archer';color:#333333;background-color:#fff;width:2.7rem;height:2.7rem;line-height:2.7rem;border:unset;border-radius:50%}.back-top-rounded:hover{color:#fff}.back-top-hidden{pointer-events:none;opacity:0}.footer{flex-grow:1;display:flex;flex-direction:column;justify-content:flex-end;padding:4rem 0 1.5rem 0;margin:0 auto;width:100%;background-color:#fff;transition:background-color 0.5s ease-out}.footer .social{width:50%;min-width:42.8125rem;line-height:2.5rem;margin:0 auto;text-align:center;vertical-align:text-bottom}.footer .social .iconfont-archer{position:relative}.footer .social .iconfont-archer{display:inline-block;text-align:center}.footer .social .iconfont-archer::before{display:inline-block;color:#777;font-size:2.4rem;margin:0 .5rem 0 0}.footer .social .iconfont-archer:last-of-child::before{margin:0}.footer .social .email{top:3.2px}.footer .social .email::before{content:'\e642'}.footer .social .email:hover::before{color:#0cb49d}.footer .social .github::before{font-size:2.56rem;content:'\e69f'}.footer .social .github:hover::before{color:#24292e}.footer .social .wechat{top:3.2px}.footer .social .wechat::before{font-size:2.24rem;content:'\ec7d'}.footer .social .wechat:hover::before{color:#42ae3c}.footer .social .qq{top:3.2px}.footer .social .qq::before{font-size:2.24rem;content:'\e61d'}.footer .social .qq:hover::before{color:#4f4e71}.footer .social .telegram{top:2px}.footer .social .telegram::before{font-size:2.08rem;content:'\e731'}.footer .social .telegram:hover::before{color:#36a1d3}.footer .social .weibo::before{font-size:2.56rem;content:'\e619'}.footer .social .weibo:hover::before{color:#d52a2a}.footer .social .zhihu{top:2.4px}.footer .social .zhihu::before{font-size:2.16rem;content:'\e61a'}.footer .social .zhihu:hover::before{color:#0f88eb}.footer .social .douban{top:1.6px}.footer .social .douban::before{font-size:2rem;content:'\e605'}.footer .social .douban:hover::before{color:#007711}.footer .social .facebook{top:4px}.footer .social .facebook::before{font-size:2.4rem;content:'\e67a'}.footer .social .facebook:hover::before{color:#3b5998}.footer .social .twitter{top:1.6px}.footer .social .twitter::before{content:'\e634'}.footer .social .twitter:hover::before{color:#1da1f2}.footer .social .instagram{top:3.2px}.footer .social .instagram::before{content:'\e79d';font-size:2.24rem}.footer .social .instagram:hover::before{color:#8042b6}.footer .social .stack-overflow{top:.8px}.footer .social .stack-overflow::before{font-size:1.84rem;content:'\e80b'}.footer .social .stack-overflow:hover::before{color:#f37f23}.footer .social .segmentFault{top:3.2px}.footer .social .segmentFault::before{font-size:2.4rem;content:'\e60c'}.footer .social .segmentFault:hover::before{color:#f37f23}.footer .social .juejin{top:.8px}.footer .social .juejin::before{font-size:2.16rem;content:'\e60b'}.footer .social .juejin:hover::before{color:#f37f23}.footer .social .v2ex::before{font-size:1.76rem;content:'\e663'}.footer .social .v2ex:hover::before{color:#171718}.footer .social .bilibili{top:4.8px}.footer .social .bilibili::before{font-size:2.8rem;content:'\e64e'}.footer .social .bilibili:hover::before{color:#2cb2f9}.footer .social .linkedin{top:-.8px}.footer .social .linkedin::before{font-size:2rem;content:'\e695'}.footer .social .linkedin:hover::before{color:#0077b5}.footer .social .steam{top:1.6px}.footer .social .steam::before{font-size:2rem;content:'\f23b'}.footer .social .steam:hover::before{color:#010101}.footer .social .others{top:-.8px}.footer .social .others::before{font-size:1.76rem;content:'\e64a'}.footer .social .others:hover::before{color:#8090b0}.footer .social .rss::before{font-size:1.68rem;content:'\e652'}.footer .social .rss:hover::before{color:#e53935}.copyright{font-family:"Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif;margin:0.5rem auto;text-align:center;color:#777}.copyright a{color:#f75357}.power{position:relative;vertical-align:baseline;font-size:1rem;padding:0 0.2rem}.website-approve{font-size:14px;font-family:"Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif;margin:0rem auto 0.5rem;text-align:center;color:#777}.website-approve a{color:#777}.icp-approve{font-family:"Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif}.beian-img{position:relative;vertical-align:middle;padding:0 0.2rem 0.3rem 0.2rem}.beian-approve{font-family:"Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif}.busuanzi-container{text-align:center}#busuanzi_container_site_pv,#busuanzi_container_site_uv{display:block;text-align:center;font:0.6rem "Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif;color:#ddd}header.header{position:fixed;top:0;width:100%;height:3.5rem;overflow:hidden;z-index:10;transform:translate3d(0, 0, 0);transition:transform 0.3s ease-in 0s;pointer-events:none}header.header-sidebar-active{transform:translate3d(400px, 0, 0)}header .header-element{pointer-events:auto}.read-progress{width:100%;position:absolute;top:0;left:0;height:3px;background-color:rgba(0,0,0,0.7);transition:transform 0.1s ease-out, opacity 0.5s ease-in-out;transform:translate3d(-100%, 0, 0);opacity:0;z-index:99999}.read-progress-feature{background-color:#f75357}.header-sidebar-menu{position:absolute;left:1rem;top:50%;border:2px solid #fff;width:1.5rem;height:1.5rem;transform:translate(0, -50%);transition:all 0.3s ease;font-family:'iconfont-archer';color:#fff;text-align:center;line-height:1.5rem;z-index:21;cursor:pointer}.header-sidebar-menu:hover{background-color:#fff;color:#121212;transform:translate(0, -50%)}.header-sidebar-menu-rounded{font-family:unset;transform:translate(0, -50%);width:2.7rem;height:2.7rem;line-height:2.7rem;border:unset;border-radius:50%}.header-sidebar-menu-rounded:hover{background-color:transparent;color:#f75357}.header-sidebar-menu-active{transform:translate(0, -50%) rotate(180deg) !important}.header-sidebar-menu-black{color:#121212;background-color:#fff;border-color:#121212}.header-sidebar-menu-black:hover{background-color:#121212;color:#fff}.header-actions{position:absolute;right:1rem;line-height:2.7rem;top:50%;transform:translate(0, -50%)}.header-actions.header-actions-hide{display:none}.header-actions>span{margin-left:1rem;padding:0.5rem}.header-actions .header-theme-btn{color:#fff;cursor:pointer}.header-actions .header-theme-btn:hover{color:#f75357}.header-actions .header-theme-btn-disabled{pointer-events:none}.header-actions .home-link{font-family:"Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif}.header-actions .home-link a{color:#fff}.header-actions .home-link a:hover{color:#f75357}.banner{position:relative;width:100%;margin:0 auto;height:calc(100% - 1px);border-bottom:1px solid rgba(0,0,0,0.8);background-color:rgba(255,255,255,0.8);transform:translate3d(0, -100%, 0);transition:transform 0.3s ease 0s}.banner .post-title{display:flex;justify-content:center;align-items:center;height:100%;width:70%;margin-left:15%}.banner .post-title a{white-space:nowrap;color:#333;max-width:100%;text-overflow:ellipsis;overflow:hidden;text-align:center;font-size:1.5rem}.banner .post-title.post-title-hide{display:none}.banner .blog-title{display:flex;position:absolute;right:1.5rem;line-height:2.7rem;top:50%;transform:translate(0, -50%);justify-content:center;align-items:center;height:100%}.banner .blog-title a{vertical-align:top;white-space:nowrap;color:#333;font:1rem/1rem "Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif}.banner .blog-title a:hover{color:#f75357}.banner.banner-show{transform:translate3d(0, 0, 0)}.banner.banner-clean{border-bottom:unset;background-color:rgba(255,255,255,0.9)}.site-intro-img{position:absolute;z-index:-1;top:0;left:0;height:calc(100% + 1px);width:100%;filter:brightness(0.5);background-repeat:no-repeat;background-position:center center;background-size:cover;background-color:transparent}.site-intro-meta{width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center}.intro-title,.intro-subtitle{font-family:"Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif;color:#fff;margin:0;opacity:0;transition:all 0.5s ease-out;transform:translate(0, -1rem)}.intro-title{font-size:4rem}.intro-subtitle{font-size:2rem;margin-top:0.5rem;transition-delay:0.5s}.intro-fade-in{opacity:1;transform:translate(0, 0)}.home-body .intro-title,.home-body .intro-subtitle{text-align:center;margin-top:0}.page-nav{padding:1rem 0 0.5rem 0;display:flex;justify-content:center}.page-nav>*{font:1.4rem "Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif;color:#252525;vertical-align:middle;margin-right:0.5rem;text-align:center}.page-nav a{position:relative;color:#ccc;overflow:visible}.page-nav a::after{content:'';position:absolute;left:calc((100% - 98%) / 2);bottom:-15%;transition:all 0.15s ease-in;width:98%;height:2px;transform:translate(0, 0);background-color:#ccc;opacity:0}.page-nav a:hover::after{transform:translate(0, -2px);opacity:1}.profile{padding-top:1rem;order:0;vertical-align:top;flex-shrink:0;width:200px;font:1rem "Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif;color:#777;border-bottom:1px solid rgba(0,0,0,0.1)}.profile a{transition:color 0.1s ease-in}.profile>*:last-child{border-bottom:none}.profile.profile-sticky{position:sticky;top:3.5rem}.profile-avatar{display:block;border-radius:1rem;width:100%;border:1px solid rgba(0,0,0,0.1)}.profile-avatar.hide-border{border:unset}.profile-name{font-size:2rem;line-height:3rem;padding:0.5rem 0 0 0;color:#333;text-align:center}.profile-signature{font-size:1rem;text-align:center}.profile-social{position:relative;width:100%;text-align:left;line-height:1.7rem;padding:0.5rem 0;border-bottom:1px solid rgba(0,0,0,0.1)}.profile-social .iconfont-archer{position:relative}.profile-social .iconfont-archer{display:inline-block;text-align:center}.profile-social .iconfont-archer::before{display:inline-block;color:#777;font-size:1.5rem;margin:0 .4rem 0 0}.profile-social .iconfont-archer:last-of-child::before{margin:0}.profile-social .email{top:2px}.profile-social .email::before{content:'\e642'}.profile-social .email:hover::before{color:#0cb49d}.profile-social .github::before{font-size:1.6rem;content:'\e69f'}.profile-social .github:hover::before{color:#24292e}.profile-social .wechat{top:2px}.profile-social .wechat::before{font-size:1.4rem;content:'\ec7d'}.profile-social .wechat:hover::before{color:#42ae3c}.profile-social .qq{top:2px}.profile-social .qq::before{font-size:1.4rem;content:'\e61d'}.profile-social .qq:hover::before{color:#4f4e71}.profile-social .telegram{top:1.25px}.profile-social .telegram::before{font-size:1.3rem;content:'\e731'}.profile-social .telegram:hover::before{color:#36a1d3}.profile-social .weibo::before{font-size:1.6rem;content:'\e619'}.profile-social .weibo:hover::before{color:#d52a2a}.profile-social .zhihu{top:1.5px}.profile-social .zhihu::before{font-size:1.35rem;content:'\e61a'}.profile-social .zhihu:hover::before{color:#0f88eb}.profile-social .douban{top:1px}.profile-social .douban::before{font-size:1.25rem;content:'\e605'}.profile-social .douban:hover::before{color:#007711}.profile-social .facebook{top:2.5px}.profile-social .facebook::before{font-size:1.5rem;content:'\e67a'}.profile-social .facebook:hover::before{color:#3b5998}.profile-social .twitter{top:1px}.profile-social .twitter::before{content:'\e634'}.profile-social .twitter:hover::before{color:#1da1f2}.profile-social .instagram{top:2px}.profile-social .instagram::before{content:'\e79d';font-size:1.4rem}.profile-social .instagram:hover::before{color:#8042b6}.profile-social .stack-overflow{top:.5px}.profile-social .stack-overflow::before{font-size:1.15rem;content:'\e80b'}.profile-social .stack-overflow:hover::before{color:#f37f23}.profile-social .segmentFault{top:2px}.profile-social .segmentFault::before{font-size:1.5rem;content:'\e60c'}.profile-social .segmentFault:hover::before{color:#f37f23}.profile-social .juejin{top:.5px}.profile-social .juejin::before{font-size:1.35rem;content:'\e60b'}.profile-social .juejin:hover::before{color:#f37f23}.profile-social .v2ex::before{font-size:1.1rem;content:'\e663'}.profile-social .v2ex:hover::before{color:#171718}.profile-social .bilibili{top:3px}.profile-social .bilibili::before{font-size:1.75rem;content:'\e64e'}.profile-social .bilibili:hover::before{color:#2cb2f9}.profile-social .linkedin{top:-.5px}.profile-social .linkedin::before{font-size:1.25rem;content:'\e695'}.profile-social .linkedin:hover::before{color:#0077b5}.profile-social .steam{top:1px}.profile-social .steam::before{font-size:1.25rem;content:'\f23b'}.profile-social .steam:hover::before{color:#010101}.profile-social .others{top:-.5px}.profile-social .others::before{font-size:1.1rem;content:'\e64a'}.profile-social .others:hover::before{color:#8090b0}.profile-social .rss::before{font-size:1.05rem;content:'\e652'}.profile-social .rss:hover::before{color:#e53935}.wechat,.qq{cursor:pointer}.wechat:hover .profile-qr,.qq:hover .profile-qr{opacity:1;visibility:visible}.profile-qr{visibility:hidden;position:absolute;left:0;bottom:2.5rem;border:3px solid #fff;border-radius:3px;z-index:99;background-color:#fff;width:7rem;padding:0.5rem;opacity:0;transition:all 0.1s ease-in 0s}.friends{padding:0.5rem 0;border-bottom:1px solid rgba(0,0,0,0.1);text-align:left}.friends div{font-size:1.2rem;text-align:left;font-weight:bold}.friends a{margin-right:0.6rem;color:#777}.friends a:hover{color:#f75357}.profile-link-item{padding:0.5rem 0;border-bottom:1px solid rgba(0,0,0,0.1)}.profile-link-item a{font-size:1.2rem;font-weight:bold;color:#777}.profile-link-item a:hover{color:#f75357}.profile-item-icon{margin-right:0.3rem}html::-webkit-scrollbar,.sidebar-panel-archives::-webkit-scrollbar,.sidebar-tags-name::-webkit-scrollbar,.sidebar-categories-name::-webkit-scrollbar,.sidebar-tags-list::-webkit-scrollbar,.sidebar-categories-list::-webkit-scrollbar,.highlight::-webkit-scrollbar{background-color:rgba(0,0,0,0.5);width:5px}html::-webkit-scrollbar-corner,.sidebar-panel-archives::-webkit-scrollbar-corner,.sidebar-tags-name::-webkit-scrollbar-corner,.sidebar-categories-name::-webkit-scrollbar-corner,.sidebar-tags-list::-webkit-scrollbar-corner,.sidebar-categories-list::-webkit-scrollbar-corner,.highlight::-webkit-scrollbar-corner{display:none}html::-webkit-scrollbar-button,.sidebar-panel-archives::-webkit-scrollbar-button,.sidebar-tags-name::-webkit-scrollbar-button,.sidebar-categories-name::-webkit-scrollbar-button,.sidebar-tags-list::-webkit-scrollbar-button,.sidebar-categories-list::-webkit-scrollbar-button,.highlight::-webkit-scrollbar-button{display:none}html::-webkit-scrollbar-button:start:increment,html::-webkit-scrollbar-button:end:decrement,.sidebar-panel-archives::-webkit-scrollbar-button:start:increment,.sidebar-panel-archives::-webkit-scrollbar-button:end:decrement,.sidebar-tags-name::-webkit-scrollbar-button:start:increment,.sidebar-tags-name::-webkit-scrollbar-button:end:decrement,.sidebar-categories-name::-webkit-scrollbar-button:start:increment,.sidebar-categories-name::-webkit-scrollbar-button:end:decrement,.sidebar-tags-list::-webkit-scrollbar-button:start:increment,.sidebar-tags-list::-webkit-scrollbar-button:end:decrement,.sidebar-categories-list::-webkit-scrollbar-button:start:increment,.sidebar-categories-list::-webkit-scrollbar-button:end:decrement,.highlight::-webkit-scrollbar-button:start:increment,.highlight::-webkit-scrollbar-button:end:decrement{display:none}html::-webkit-scrollbar-thumb,.sidebar-panel-archives::-webkit-scrollbar-thumb,.sidebar-tags-name::-webkit-scrollbar-thumb,.sidebar-categories-name::-webkit-scrollbar-thumb,.sidebar-tags-list::-webkit-scrollbar-thumb,.sidebar-categories-list::-webkit-scrollbar-thumb,.highlight::-webkit-scrollbar-thumb{border-radius:8px;background-color:rgba(0,0,0,0.2)}html::-webkit-scrollbar-track,html::-webkit-scrollbar-thumb,.sidebar-panel-archives::-webkit-scrollbar-track,.sidebar-panel-archives::-webkit-scrollbar-thumb,.sidebar-tags-name::-webkit-scrollbar-track,.sidebar-tags-name::-webkit-scrollbar-thumb,.sidebar-categories-name::-webkit-scrollbar-track,.sidebar-categories-name::-webkit-scrollbar-thumb,.sidebar-tags-list::-webkit-scrollbar-track,.sidebar-tags-list::-webkit-scrollbar-thumb,.sidebar-categories-list::-webkit-scrollbar-track,.sidebar-categories-list::-webkit-scrollbar-thumb,.highlight::-webkit-scrollbar-track,.highlight::-webkit-scrollbar-thumb{border:none}html::-webkit-scrollbar-thumb,.sidebar-panel-archives::-webkit-scrollbar-thumb,.sidebar-tags-name::-webkit-scrollbar-thumb,.sidebar-categories-name::-webkit-scrollbar-thumb,.sidebar-tags-list::-webkit-scrollbar-thumb,.sidebar-categories-list::-webkit-scrollbar-thumb,.highlight::-webkit-scrollbar-thumb{background-color:rgba(255,255,255,0.2);border-radius:0px}html::-webkit-scrollbar-track:hover,.sidebar-panel-archives::-webkit-scrollbar-track:hover,.sidebar-tags-name::-webkit-scrollbar-track:hover,.sidebar-categories-name::-webkit-scrollbar-track:hover,.sidebar-tags-list::-webkit-scrollbar-track:hover,.sidebar-categories-list::-webkit-scrollbar-track:hover,.highlight::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,0.1)}.sidebar-archive::-webkit-scrollbar-thumb,.sidebar-tags-name::-webkit-scrollbar-thumb,.sidebar-categories-name::-webkit-scrollbar-thumb,.sidebar-tags-list::-webkit-scrollbar-thumb,.sidebar-categories-list::-webkit-scrollbar-thumb{border-radius:8px;background-color:rgba(255,255,255,0.7)}.sidebar-archive::-webkit-scrollbar-thumb,.sidebar-tags-name::-webkit-scrollbar-thumb,.sidebar-categories-name::-webkit-scrollbar-thumb,.sidebar-tags-list::-webkit-scrollbar-thumb,.sidebar-categories-list::-webkit-scrollbar-thumb{background-color:rgba(255,255,255,0.7);border-radius:0px}.sidebar-archive::-webkit-scrollbar-track:hover,.sidebar-tags-name::-webkit-scrollbar-track:hover,.sidebar-categories-name::-webkit-scrollbar-track:hover,.sidebar-tags-list::-webkit-scrollbar-track:hover,.sidebar-categories-list::-webkit-scrollbar-track:hover{background-color:rgba(255,255,255,0.7)}.highlight::-webkit-scrollbar{height:5px}.highlight::-webkit-scrollbar-thumb{border-radius:8px;background-color:rgba(255,255,255,0.3)}.highlight::-webkit-scrollbar-thumb{background-color:rgba(255,255,255,0.3);border-radius:0px}.highlight::-webkit-scrollbar-track:hover{background-color:rgba(255,255,255,0.3)}.popup{display:none;position:fixed;top:10%;left:50%;width:700px;height:80%;margin-left:-350px;padding:3px 0 0 10px;background:#fff;color:#333;z-index:9999;box-shadow:0px 0px 10px rgba(0,0,0,0.5);border-radius:5px}@media (max-width: 767px){.popup{padding:3px;top:0;left:0;margin:0;width:100%;height:100%;border-radius:0px}}.popoverlay{position:fixed;width:100%;height:100%;top:0px;left:0px;z-index:2080;background-color:rgba(0,0,0,0.3)}.popup-btn-close{display:inline-block;color:#f75357;cursor:pointer}.popup-btn-close .iconfont-archer{font-size:20px}.algolia-popup{overflow:hidden;padding:0}.algolia-popup .popup-btn-close{padding:10px;border-left:1px solid #ddd}.algolia-popup .popup-btn-close .fa{color:#999;font-size:18px}.algolia-popup .popup-btn-close:hover .fa{color:#222}.algolia-search{display:flex;justify-content:space-between;align-items:center;padding:5px;border-bottom:1px solid #ccc;background:#f5f5f5;border-top-left-radius:5px;border-top-right-radius:5px}.algolia-search-input-icon{display:inline-block;width:20px;padding:0px 10px}.algolia-search-input-icon .fa{font-size:18px}.algolia-search-input{display:inline-block;width:calc(90% - 20px)}.algolia-search-input input{padding:5px 0;width:100%;outline:none;border:none;background:transparent}.algolia-powered{float:right}.algolia-powered img{display:inline-block;height:18px;vertical-align:middle}.algolia-stats{margin-top:20px}.algolia-results{position:relative;overflow:auto;height:calc(100% - 50px)}.algolia-results hr{margin:10px 0}.algolia-results .highlight{font-style:normal;margin:0;padding:0 2px;font-size:inherit;color:#f00}.algolia-stat-root{font-weight:lighter;color:#aaa;padding-left:20px;padding-right:20px}.algolia-hits{margin-top:20px}.algolia-hit-list{padding-left:0}.algolia-hit-empty{display:flex;flex-direction:column;align-items:center;margin-top:4em}.algolia-hit-empty-label{margin-top:1em}.algolia-hit-item{margin:0;--border-opacity: 1;padding:10px 20px;border-bottom:1px dashed;border-color:rgba(245, 245, 250, var(--border-opacity));cursor:pointer}.algolia-hit-item:hover{background:#eee;border-color:transparent}.algolia-hit-item-link{color:#555;padding:0 0 2px 0;display:block;transition-duration:0.2s;transition-timing-function:ease-in-out;transition-delay:0s}.algolia-hit-item-link em{font-style:normal;color:#f75357}.ais-Pagination-list{display:flex;justify-content:center;padding:0;margin:20px 0;border-top:none}.ais-Pagination-item{display:inline-block;margin:0 5px}.ais-Pagination-item a{color:#f75357}.ais-Pagination-item--active a{pointer-events:none;cursor:auto;color:#222}.ais-Pagination-item--page{border-top:none}.ais-Pagination-item--page:hover{border-bottom:1px solid #222}.algolia-pop-overlay{position:fixed;top:0;right:0;left:0;bottom:0;z-index:50}.abstract-content pre,.abstract-content .highlight,.article-entry pre,.article-entry .highlight{margin:0.8rem 0;padding:0.7rem 0.7rem;overflow:auto;font-size:0.9rem;line-height:1.3rem}.abstract-content .highlight .gutter pre,.abstract-content .highlight .gutter pre .line,.abstract-content .gist .gist-file .gist-data .line-numbers,.article-entry .highlight .gutter pre,.article-entry .highlight .gutter pre .line,.article-entry .gist .gist-file .gist-data .line-numbers{color:#666}.abstract-content pre,.abstract-content code,.article-entry pre,.article-entry code{font-family:'Source Code Pro', Consolas, Menlo, Monaco, 'Courier New', monospace;font-weight:400}.abstract-content code,.article-entry code{background:#eee;padding:1px 0.4rem;border-radius:2px;margin:0 0.2rem;border:none;transition:all 0.5s ease-out}.abstract-content pre code,.article-entry pre code{background:none;text-shadow:none;padding:0;color:#657b83}.abstract-content .highlight,.article-entry .highlight{border-radius:4px}.abstract-content .highlight pre,.article-entry .highlight pre{border:none;margin:0;padding:0}.abstract-content .highlight table,.article-entry .highlight table{margin:0;width:auto}.abstract-content .highlight td,.article-entry .highlight td{border:none;padding:0}.abstract-content .highlight figcaption,.article-entry .highlight figcaption{color:highlight-comment;line-height:1em;margin-bottom:1em}.abstract-content .highlight figcaption:before,.abstract-content .highlight figcaption:after,.article-entry .highlight figcaption:before,.article-entry .highlight figcaption:after{content:'';display:table}.abstract-content .highlight figcaption:after,.article-entry .highlight figcaption:after{clear:both}.abstract-content .highlight figcaption a,.article-entry .highlight figcaption a{float:right}.abstract-content .highlight .gutter pre,.article-entry .highlight .gutter pre{text-align:right;padding-right:20px}.abstract-content .highlight .gutter pre .line,.article-entry .highlight .gutter pre .line{text-shadow:none}.abstract-content .highlight .line,.article-entry .highlight .line{min-height:19px}.abstract-content .highlight,.abstract-content pre,.article-entry .highlight,.article-entry pre{color:#abb2bf;background:#282c34}.abstract-content .highlight pre .comment,.abstract-content .highlight pre .quote,.article-entry .highlight pre .comment,.article-entry .highlight pre .quote{color:#5c6370;font-style:italic}.abstract-content .highlight pre .doctag,.abstract-content .highlight pre .keyword,.abstract-content .highlight pre .formula,.article-entry .highlight pre .doctag,.article-entry .highlight pre .keyword,.article-entry .highlight pre .formula{color:#c678dd}.abstract-content .highlight pre .section,.abstract-content .highlight pre .name,.abstract-content .highlight pre .selector-tag,.abstract-content .highlight pre .deletion,.abstract-content .highlight pre .subst,.article-entry .highlight pre .section,.article-entry .highlight pre .name,.article-entry .highlight pre .selector-tag,.article-entry .highlight pre .deletion,.article-entry .highlight pre .subst{color:#e06c75}.abstract-content .highlight pre .literal,.article-entry .highlight pre .literal{color:#56b6c2}.abstract-content .highlight pre .string,.abstract-content .highlight pre .regexp,.abstract-content .highlight pre .addition,.abstract-content .highlight pre .attribute,.abstract-content .highlight pre .meta-string,.article-entry .highlight pre .string,.article-entry .highlight pre .regexp,.article-entry .highlight pre .addition,.article-entry .highlight pre .attribute,.article-entry .highlight pre .meta-string{color:#98c379}.abstract-content .highlight pre .built_in,.abstract-content .highlight pre .class pre .title,.article-entry .highlight pre .built_in,.article-entry .highlight pre .class pre .title{color:#e6c07b}.abstract-content .highlight pre .attr,.abstract-content .highlight pre .variable,.abstract-content .highlight pre .template-variable,.abstract-content .highlight pre .type,.abstract-content .highlight pre .selector-class,.abstract-content .highlight pre .selector-attr,.abstract-content .highlight pre .selector-pseudo,.abstract-content .highlight pre .number,.article-entry .highlight pre .attr,.article-entry .highlight pre .variable,.article-entry .highlight pre .template-variable,.article-entry .highlight pre .type,.article-entry .highlight pre .selector-class,.article-entry .highlight pre .selector-attr,.article-entry .highlight pre .selector-pseudo,.article-entry .highlight pre .number{color:#d19a66}.abstract-content .highlight pre .symbol,.abstract-content .highlight pre .bullet,.abstract-content .highlight pre .link,.abstract-content .highlight pre .meta,.abstract-content .highlight pre .selector-id,.abstract-content .highlight pre .title,.article-entry .highlight pre .symbol,.article-entry .highlight pre .bullet,.article-entry .highlight pre .link,.article-entry .highlight pre .meta,.article-entry .highlight pre .selector-id,.article-entry .highlight pre .title{color:#61aeee}.abstract-content .highlight pre .emphasis,.article-entry .highlight pre .emphasis{font-style:italic}.abstract-content .highlight pre .strong,.article-entry .highlight pre .strong{font-weight:bold}.abstract-content .highlight pre .link,.article-entry .highlight pre .link{text-decoration:underline}.abstract-content .gist,.article-entry .gist{margin:0 -20px;border-style:solid;border-color:#ddd;border-width:1px 0;background:#272822;padding:15px 20px 15px 0}.abstract-content .gist .gist-file,.article-entry .gist .gist-file{border:none;font-family:'Source Code Pro', Consolas, Monaco, Menlo, Consolas, monospace;margin:0}.abstract-content .gist .gist-file .gist-data,.article-entry .gist .gist-file .gist-data{background:none;border:none}.abstract-content .gist .gist-file .gist-data .line-numbers,.article-entry .gist .gist-file .gist-data .line-numbers{background:none;border:none;padding:0 20px 0 0}.abstract-content .gist .gist-file .gist-data .line-data,.article-entry .gist .gist-file .gist-data .line-data{padding:0 !important}.abstract-content .gist .gist-file .highlight,.article-entry .gist .gist-file .highlight{margin:0;padding:0;border:none}.abstract-content .gist .gist-file .gist-meta,.article-entry .gist .gist-file .gist-meta{background:#272822;color:highlight-comment;font:0.85em 'Helvetica Neue', Helvetica, Arial, sans-serif;text-shadow:0 0;padding:0;margin-top:1em;margin-left:20px}.abstract-content .gist .gist-file .gist-meta a,.article-entry .gist .gist-file .gist-meta a{color:#258fb8;font-weight:normal}.abstract-content .gist .gist-file .gist-meta a:hover,.article-entry .gist .gist-file .gist-meta a:hover{text-decoration:underline}.archer-float-left{float:left;margin-right:1rem}.archer-float-right{float:right;margin-left:1rem}.sidebar-panel-archives{padding:1rem}.sidebar-panel-archives ul{padding:0;margin:0}.ps__rail-x,.ps__rail-y{display:none !important}.post-archive{overflow-y:auto}.archive-post-item,.meta-post-item{font-family:var(--base-font-family);display:flex;align-items:baseline;border-left:1px solid #bbb;margin-left:0.3rem;padding:0.2rem 0 0.3rem 0.5rem}.archive-post-item:hover,.meta-post-item:hover{border-left-color:#f75357}.archive-post-item:hover .archive-post-date,.meta-post-item:hover .archive-post-date,.archive-post-item:hover .meta-post-date,.meta-post-item:hover .meta-post-date,.archive-post-item:hover .archive-post-title,.meta-post-item:hover .archive-post-title,.archive-post-item:hover .meta-post-title,.meta-post-item:hover .meta-post-title{color:#f75357}.total-and-search{display:flex}.site-search.site-search-loading{display:none}.site-search .search-icon{cursor:pointer;color:#f75357;line-height:2.3rem;font-size:1.4rem;position:relative;margin-left:0.5rem}.archive-year,.total-archive{font:1.2rem "Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif;color:#f75357}.archive-year{font-size:1rem;margin:0.3rem 0 0.3rem 0}.archive-post-date,.meta-post-date{font:0.9rem/1rem "Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif;color:#999}.archive-post-title,.meta-post-title{font-size:1rem;line-height:1.4rem;margin-left:0.8rem;text-align:left;color:#ccc}.sidebar-panel-tags,.sidebar-panel-categories{padding:1rem 1rem 5px 1rem;position:relative;display:flex;flex-direction:column}.sidebar-tags-name,.sidebar-categories-name{flex-grow:0;width:100%;padding:0 0 1rem 0;max-height:28rem;overflow:auto}.sidebar-tag-name,.sidebar-category-name{display:inline-block;border:1px solid #fff;border-radius:5rem;padding:0.07rem 0.4rem 0.1rem 0.4rem;margin:0.2rem 0;white-space:nowrap;font-size:1rem;cursor:pointer;color:#fff}.sidebar-tag-name:hover,.sidebar-category-name:hover{border-color:#f75357;color:#f75357}.sidebar-tag-name .iconfont-archer,.sidebar-category-name .iconfont-archer{pointer-events:none;transform:translateY(-1rem);font-size:0.6rem;margin:0 0.3rem 0 0.1rem}.sidebar-category-name .iconfont-archer{font-size:16px}.sidebar-tags-empty,.sidebar-categories-empty{display:none}.sidebar-tags-empty-active,.sidebar-categories-empty-active{display:block;font-size:6rem !important;margin-top:7rem;-webkit-user-select:none;-moz-user-select:none;user-select:none;text-align:center;color:#fff}.sidebar-label-focus{border-color:#f75357;color:#f75357}.sidebar-tags-list,.sidebar-categories-list{flex-grow:1;padding:1rem 1rem 0 0;overflow-y:auto}.sidebar{position:fixed;display:flex;flex-direction:column;left:0;top:0;z-index:-9999;height:100%;width:400px;transition:all 0.3s ease-in 0s;overflow-x:hidden;background-color:#222}.sidebar-hide{display:none}.sidebar-tabs{display:flex;position:relative;padding:0;margin:0;height:4rem;width:100%;z-index:1001;justify-content:space-around;align-items:flex-start;font-family:"Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif;flex-grow:0;color:#eee;border-bottom:2px solid #666}.sidebar-tabs::after{content:'';position:absolute;width:33.33%;height:2px;left:0;top:100%;background-color:#f75357;transform:translate3d(0, 0, 0);transition:transform 0.2s ease-out 0s}.sidebar-tab-archives,.sidebar-tab-tags,.sidebar-tab-categories{display:flex;align-items:center;justify-content:center;font-size:1.3rem;width:33.33%;height:100%;cursor:pointer}.sidebar-tab-archives .iconfont-archer,.sidebar-tab-tags .iconfont-archer,.sidebar-tab-categories .iconfont-archer{pointer-events:none;margin:0 0.5rem 0 0rem;font-size:1.5rem}.tab-name{pointer-events:none;font-size:1.5rem;margin-left:0.2rem}.sidebar-tabs-active-0::after{transform:translate3d(0, 0, 0)}.sidebar-tabs-active-1::after{transform:translate3d(100%, 0, 0)}.sidebar-tabs-active-2::after{transform:translate3d(200%, 0, 0)}.sidebar-content{position:relative;display:flex;width:300%;height:calc(100% - 4rem);top:0;left:0;overflow-x:hidden;transition:transform 0.3s ease-out 0s;transform:translate3d(0, 0, 0)}.sidebar-panel-archives,.sidebar-panel-tags,.sidebar-panel-categories{overflow-x:hidden;overflow-y:auto;flex-shrink:0;width:calc(33.33% - 2rem);-webkit-overflow-scrolling:touch}.sidebar-content-active-0{transform:translate3d(0, 0, 0)}.sidebar-content-active-1{transform:translate3d(-33.33%, 0, 0)}.sidebar-content-active-2{transform:translate3d(-66.67%, 0, 0)}.index-post{background-color:#fdfdfd;border-radius:0.5rem;position:relative;padding:1rem;z-index:3;transition:background-color 0.5s ease-out}.index-post .abstract-content{color:#585858;font-size:1rem;font-weight:300;word-break:break-word}.index-post .abstract-content img{max-height:60vh;box-shadow:none}.index-post .abstract-content h1{font-weight:normal}.index-post .abstract-content h1 .headerlink,.index-post .abstract-content h1 .anchorjs-link{display:none}.index-post .abstract-content h2{font-weight:normal}.index-post .abstract-content h2 .headerlink,.index-post .abstract-content h2 .anchorjs-link{display:none}.index-post .abstract-content h3{font-weight:normal}.index-post .abstract-content h3 .headerlink,.index-post .abstract-content h3 .anchorjs-link{display:none}.index-post .abstract-content h4{font-weight:normal}.index-post .abstract-content h4 .headerlink,.index-post .abstract-content h4 .anchorjs-link{display:none}.index-post .abstract-content h5{font-weight:normal}.index-post .abstract-content h5 .headerlink,.index-post .abstract-content h5 .anchorjs-link{display:none}.index-post .abstract-content h6{font-weight:normal}.index-post .abstract-content h6 .headerlink,.index-post .abstract-content h6 .anchorjs-link{display:none}.abstract-title{display:flex;align-items:baseline;line-height:2.5rem;margin-bottom:0.5rem;transition:color 0.1s ease-in;color:#333}.abstract-title:hover{color:#f75357}.abstract-title .stick-top{font-size:1.3rem;margin-right:0.5rem}.abstract-title .abstract-title-text{font-size:1.7rem}.index-post .abstract-read-more-button{font-family:"Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif;font-size:1rem}.index-post .abstract-read-more-button a{color:#aaa;padding-top:1rem;display:flex;justify-content:flex-end;align-items:center;transition:color 0.1s ease-in}.index-post .abstract-read-more-button a:hover{color:#f75357}.abstract-post-meta{display:flex;justify-content:space-between;margin-top:1rem;font-size:1rem;font-family:"Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif;color:#aaa}.abstract-post-meta a{color:#aaa}.abstract-post-meta .abstract-calander{position:relative;top:-0.1rem;margin-right:0.3rem}.abstract-post-meta .abstract-tags{text-align:right}.abstract-post-meta .post-category{cursor:pointer;position:relative;margin-left:0.4rem;font-weight:lighter}.abstract-post-meta .post-category::after{content:'';position:absolute;left:calc((100% - 98%) / 2);bottom:-15%;transition:all 0.15s ease-in;width:98%;height:2px;transform:translate(0, 0);background-color:#aaa;opacity:0}.abstract-post-meta .post-category:hover::after{transform:translate(0, -2px);opacity:1}.abstract-post-meta .post-category-icon{margin-right:2px;pointer-events:none}.abstract-post-meta .post-category-text{pointer-events:none}.abstract-post-meta .post-tag{position:relative;margin-left:0.4rem;font-weight:lighter}.abstract-post-meta .post-tag::before{margin-right:2px;content:'#'}.abstract-post-meta .post-tag::after{content:'';position:absolute;left:calc((100% - 98%) / 2);bottom:-15%;transition:all 0.15s ease-in;width:98%;height:2px;transform:translate(0, 0);background-color:#aaa;opacity:0}.abstract-post-meta .post-tag:hover::after{transform:translate(0, -2px);opacity:1}.index-post-divider{margin:0.5rem;border-bottom:1px dashed rgba(0,0,0,0.2)}.post-body main,.about-body main{margin:0}.anchorjs-archer{color:#f75357;border:none !important}.post-body .site-intro-meta,.about-body .site-intro-meta{width:50%;min-width:42.8125rem;margin:0 auto;align-items:flex-start}.post-body .intro-title,.about-body .intro-title{font:4rem/5.3rem "Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif;color:#fff;margin:0}.post-intros{opacity:0;transition:all 0.5s ease-out 0.5s;transform:translate3d(0, -1rem, 0)}.post-intro-tags{font:1.2rem "Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif;color:#fff}.post-intro-tags a{color:#fff}.post-intro-tags .post-category{cursor:pointer;position:relative;margin-left:0;margin-right:0.5rem}.post-intro-tags .post-category::after{content:'';position:absolute;left:calc((100% - 98%) / 2);bottom:-15%;transition:all 0.15s ease-in;width:98%;height:2px;transform:translate(0, 0);background-color:#fff;opacity:0}.post-intro-tags .post-category:hover::after{transform:translate(0, -2px);opacity:1}.post-intro-tags .post-category-icon{margin-right:2px;pointer-events:none}.post-intro-tags .post-category-text{pointer-events:none}.post-intro-tags .post-tag{position:relative;margin-left:0;margin-right:0.5rem}.post-intro-tags .post-tag::after{content:'';position:absolute;left:calc((100% - 98%) / 2);bottom:-15%;transition:all 0.15s ease-in;width:98%;height:2px;transform:translate(0, 0);background-color:#fff;opacity:0}.post-intro-tags .post-tag:hover::after{transform:translate(0, -2px);opacity:1}.post-intro-tags .post-tag::before{margin-right:2px;content:'#'}.post-intro-meta{margin-top:0.2rem;font:1.1rem "Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif;color:#fff;display:flex;align-items:center}.post-intro-read{margin-top:0.2rem;font:0.9rem "Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif;color:#fff;display:flex;align-items:center}.word-count{margin-right:1rem}.post-fade-in{opacity:1;transform:translate3d(0, 0, 0)}.post-intro-calander{font-size:0.9rem !important;margin-right:0.3rem}.post-intro-time{font-size:0.9rem;margin-right:0.5rem}.busuanzi-pv,.busuanzi-uv{font-size:0.9rem;margin-right:0.4rem}.post-intro-busuanzi{font-size:0.9rem !important}.share-wrapper{position:relative;font-size:0.9rem;padding:0 0.5rem 0 0}.share-wrapper:hover .share-list{visibility:visible;opacity:1}.share-icon{font-size:0.9rem !important;cursor:pointer}.share-text{font-family:"Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif;cursor:pointer}.share-list{position:absolute;visibility:hidden;margin:0;padding:0;left:100%;bottom:0;display:flex;opacity:0;transition:all 0.1s ease-in 0s}.share-list .iconfont-archer{display:inline-block;margin-right:3px;cursor:pointer}.share-list .iconfont-archer:hover{color:#aaa}.share-list [data-type='weibo']{position:relative;top:-2px}.share-list [data-type='facebook']{position:relative;top:1px}.share-qr{position:relative}.share-qrcode{position:absolute;left:0;bottom:1.5rem;visibility:hidden;opacity:0;transition:all 0.1s ease-in 0s}.share-qr:hover .share-qrcode{visibility:visible;opacity:1}.post-paginator{overflow:hidden;margin:0;list-style:none;padding:2.5rem 0 1rem 0;display:flex;justify-content:space-between}.post-paginator li{position:relative;max-width:13rem}.post-paginator .nextTitle,.post-paginator .prevTitle{font-size:1.2rem;color:#ccc}.post-paginator .nextTitle:hover,.post-paginator .prevTitle:hover{color:#f75357}.post-paginator .nextSlogan,.post-paginator .prevSlogan{font:bold 1.4rem "Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif;color:#252525}.post-paginator .nextSlogan::before{content:'< ';font-size:1.7rem}.post-paginator .prevSlogan::after{content:' >';font-size:1.7rem}.post-paginator .prevTitle,.post-paginator .prevSlogan{text-align:right}.article-entry{background-color:#fdfdfd;border-radius:0.5rem 0.5rem 0 0;padding:0.5rem 1.5rem;transition:background-color 0.5s ease-out;overflow:hidden}.abstract-content,.article-entry{position:relative;font-weight:lighter;font-weight:400;color:#23394d}.abstract-content li,.article-entry li{word-wrap:break-all;line-height:1.625}.abstract-content ul,.abstract-content ul li,.article-entry ul,.article-entry ul li{list-style-type:initial;margin-top:0.25em}.abstract-content ol,.abstract-content ol li,.article-entry ol,.article-entry ol li{list-style-type:decimal-leading-zero;margin-top:0.25em}.abstract-content h1 .headerlink,.article-entry h1 .headerlink{display:none}.abstract-content h2 .headerlink,.article-entry h2 .headerlink{display:none}.abstract-content h3 .headerlink,.article-entry h3 .headerlink{display:none}.abstract-content h4 .headerlink,.article-entry h4 .headerlink{display:none}.abstract-content h5 .headerlink,.article-entry h5 .headerlink{display:none}.abstract-content h6 .headerlink,.article-entry h6 .headerlink{display:none}.abstract-content h5,.article-entry h5{font-size:1rem;margin:1rem 0}.abstract-content h6,.article-entry h6{font-size:0.8rem;margin:1rem 0}.abstract-content p,.article-entry p{line-height:1.625}.abstract-content em,.article-entry em{font-style:italic}.abstract-content img,.article-entry img{display:block;max-width:100%;margin:1rem auto 1rem;box-shadow:0 0 4px 2px rgba(0,0,0,0.2)}.abstract-content blockquote,.article-entry blockquote{margin:1.5em 0;padding:1rem 1.5rem;position:relative;background-color:#f6f6f6;border-left:0.35rem solid #f75357;border-radius:0.35rem;transition:all 0.5s ease-out}.abstract-content blockquote p,.article-entry blockquote p{margin:0}.abstract-content .table-container table,.abstract-content>table,.article-entry .table-container table,.article-entry>table{width:100%;border:1px solid #ddd;margin:1rem 0;border-collapse:collapse;box-shadow:2px 2px 2px rgba(0,0,0,0.125)}.abstract-content .table-container table tr,.abstract-content .table-container table td,.abstract-content>table tr,.abstract-content>table td,.article-entry .table-container table tr,.article-entry .table-container table td,.article-entry>table tr,.article-entry>table td{height:2rem}.abstract-content .table-container table thead tr,.abstract-content>table thead tr,.article-entry .table-container table thead tr,.article-entry>table thead tr{background:#f8f8f8}.abstract-content .table-container table tbody tr:hover,.abstract-content>table tbody tr:hover,.article-entry .table-container table tbody tr:hover,.article-entry>table tbody tr:hover{background:#efefef}.abstract-content .table-container table td,.abstract-content .table-container table th,.abstract-content>table td,.abstract-content>table th,.article-entry .table-container table td,.article-entry .table-container table th,.article-entry>table td,.article-entry>table th{border:1px solid #dedede;padding:0.2rem 1rem 0 1rem}.abstract-content a,.article-entry a{color:#f75357;padding:0 2px 0 2px;word-break:break-all}.abstract-content a:hover,.article-entry a:hover{border-bottom:1px solid #f75357}.abstract-content a.fancybox,.article-entry a.fancybox{border:0}.license-wrapper{background-color:#fdfdfd;border-radius:0 0 0.5rem 0.5rem;padding:0.5rem 1.5rem;font-weight:300;line-height:1.5rem;border-top:1px dashed #ccc;border-bottom:1px dashed #ccc;color:#23394d;transition:all 0.5s ease-out}.license-wrapper p{margin:0.2rem 0}.license-wrapper a{color:#f75357;word-break:break-all}.license-wrapper :first-child{margin-top:1rem}.license-wrapper :last-child{margin-bottom:1rem}.toc-wrapper{display:block;position:absolute;width:22%;right:1%;opacity:1;max-width:calc((100% - 42.8125rem - 4rem) / 2);z-index:9998;margin-top:calc(3.5rem + 1rem);transform:translate3d(0, 0, 0);transition:transform 0.4s ease-out, opacity 0.4s ease-out}.toc-wrapper .toc-active{color:#f75357}.toc-wrapper-loding{opacity:0}.toc-catalog{color:#bbb;padding:0.5rem 0rem;z-index:2;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;font:bolder 1.2rem "Oswald-Regular",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,"PingFang SC","Hiragino Sans GB",STHeiti,"Microsoft YaHei","Microsoft JhengHei","Source Han Sans SC","Noto Sans CJK SC","Source Han Sans CN","Noto Sans SC","Source Han Sans TC","Noto Sans CJK TC","WenQuanYi Micro Hei",SimSun,sans-serif}.toc-catalog:hover{color:#f75357}.catalog-icon{position:relative;top:-0.1rem;margin-right:0.3rem}.toc{max-height:calc(100vh - 3.5rem - 3.5rem - 5rem);overflow:auto}.toc::-webkit-scrollbar{display:none}.toc,.toc-child{padding-left:0;margin:0 0 0 0;padding-top:2px;z-index:1}.toc-wrapper>*{transform:translate(0, 0);transition:transform 0.3s ease-out, opacity 0.3s ease-out, color 0.5s ease-out;opacity:1}.toc-wrapper ol{padding-left:1rem}.toc-wrapper .toc-number{font-weight:bold}.toc-wrapper a{color:#ccc}.toc-wrapper a:hover{color:#f75357 !important}.toc-hide-children>*{transform:translate(20%, 0);opacity:0}.toc-hide-children .toc-catalog{display:block;transform:none;opacity:1}.toc-fixed{position:fixed;top:0rem !important}.toc-slide{transform:translate3d(400px, 0, 0)}.toc-hide{display:none}.toc-item{margin-bottom:2px}.post-comment{margin:1rem 0}.four-zero-four-body .loading{display:none !important}.four-zero-four-body .site-intro{height:100%}.four-zero-four-body .site-intro-meta{height:80%}.four-zero-four-body .intro-title{width:80%;text-align:center}.four-zero-four-body .intro-subtitle{width:90%;text-align:center}.four-zero-four-body .wrapper{height:100vh;padding-bottom:0}.four-zero-four-body .container{padding:0}.four-zero-four-body .footer{width:100%;z-index:30;background-color:transparent;position:absolute;bottom:0}.four-zero-four-body .iconfont-archer::before{color:rgba(255,255,255,0.5)}.four-zero-four-body .copyright{color:#ddd}.four-zero-four-body .website-approve a{color:#ddd}.four-zero-four-body #busuanzi_container_site_pv,.four-zero-four-body #busuanzi_container_site_uv{color:#ddd}#gitalk-container a{color:#f75357 !important}#gitalk-container a:hover{color:#fcb4b6 !important;border-color:#fcb4b6 !important}#gitalk-container .gt-svg svg{fill:#f75357 !important}#gitalk-container .gt-spinner::before{border-color:#fff !important;border-top-color:#f75357 !important}#gitalk-container .gt-btn{background-color:#f75357 !important;border-color:#f75357 !important;color:#fff !important}#gitalk-container .gt-btn-login:hover{background-color:#fcb4b6 !important;border-color:#fcb4b6 !important}#gitalk-container .gt-btn-preview{background-color:#fff !important;color:#f75357 !important}#gitalk-container .gt-btn-preview:hover{background-color:#f2f2f2 !important;border-color:#fcb4b6 !important}#gitalk-container .gt-btn-public:hover{background-color:#fcb4b6 !important;border-color:#fcb4b6 !important}#gitalk-container .gt-link{border-bottom-color:#f75357 !important}#gitalk-container .gt-user .is--poping .gt-ico svg{fill:#f75357 !important}#gitalk-container .gt-popup .gt-action.is--active:before{background:#f75357 !important}#gitalk-container .gt-header-controls-tip{color:#f75357 !important}#gitalk-container .gt-comment-username{color:#f75357 !important} + +/*# sourceMappingURL=style.css.map */ diff --git a/css/style.css.map b/css/style.css.map new file mode 100644 index 000000000..4e8ad0f74 --- /dev/null +++ b/css/style.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["_variables.scss","_normalize.scss","_common.scss","_partial/_partial/_footer-fixed.scss","_partial/_partial/_footer.scss","_mixin.scss","_partial/_partial/_header.scss","_partial/_partial/_intro.scss","_partial/_partial/_paginator.scss","_partial/_partial/_profile.scss","_partial/_partial/_scrollbar.scss","_partial/_algolia.scss","_partial/_post/_code.scss","_partial/_post/_writing-enhance.scss","_partial/_sidebar/_sidebar-archive.scss","_partial/_sidebar/_sidebar-tags.scss","_partial/_sidebar/_sidebar.scss","_partial/_index-page.scss","_partial/_post-page.scss","_partial/_404.scss","_partial/_comment/_gitalk.scss"],"names":[],"mappings":"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","file":"style.css","sourcesContent":["// You can change the following settings by yourself :-)\n\n:root {\n --base-font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Arial,\n 'PingFang SC', 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei',\n 'Microsoft JhengHei', 'Source Han Sans SC', 'Noto Sans CJK SC',\n 'Source Han Sans CN', 'Noto Sans SC', 'Source Han Sans TC',\n 'Noto Sans CJK TC', 'WenQuanYi Micro Hei', SimSun, sans-serif;\n}\n\n// ========== DIY ========== //\n$feature-color: #f75357;\n$feature-color-dark: #f75357; // Feature color in dark mode\n$code-theme: 'atom-one-dark'; // atom-one-dark or atom-one-light\n\n// ========== global variables ========== //\n$body-background-color: #fff;\n$foreground-color: #fdfdfd;\n$body-background-color-dark: #121212;\n$foreground-color-dark: #181818;\n$base-font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Arial,\n 'PingFang SC', 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei',\n 'Microsoft JhengHei', 'Source Han Sans SC', 'Noto Sans CJK SC',\n 'Source Han Sans CN', 'Noto Sans SC', 'Source Han Sans TC', 'Noto Sans CJK TC',\n 'WenQuanYi Micro Hei', SimSun, sans-serif;\n$feature-font-family: 'Oswald-Regular', $base-font-family;\n$base-font-size: 16px !default;\n\n// ========== CSS Variables ========== //\n$base-font-family: var(--base-font-family);\n\n// ========== common ========== //\n$container-margin-top: 3rem;\n$selection-background-color: $feature-color;\n$selection-background-color-dark: $feature-color-dark;\n$selection-text-color: #eee;\n$selection-text-color-dark: snow;\n\n// ========= dark mode ========= //\n$text-color-primary-dark: rgba(255, 255, 255, 0.87);\n$text-color-secondary-dark: rgba(255, 255, 255, 0.6);\n$text-color-minor-dark: rgba(255, 255, 255, 0.38);\n$transition-animation: all 0.5s ease-out;\n\n// ========== iconfont ========== //\n@font-face {\n font-family: 'iconfont-archer'; /* project id 327081 */\n src: url('//at.alicdn.com/t/font_327081_s1wbjxwfu9c.eot');\n src: url('//at.alicdn.com/t/font_327081_s1wbjxwfu9c.eot?#iefix')\n format('embedded-opentype'),\n url('//at.alicdn.com/t/font_327081_s1wbjxwfu9c.woff') format('woff'),\n url('//at.alicdn.com/t/font_327081_s1wbjxwfu9c.ttf') format('truetype'),\n url('//at.alicdn.com/t/font_327081_s1wbjxwfu9c.svg#iconfont-archer')\n format('svg');\n}\n\n.iconfont-archer {\n font-family: 'iconfont-archer' !important;\n font-size: 1rem;\n font-style: normal;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// ======= fixed footer ======= //\n$footer-fixed-height: 3.5rem;\n\n// ========== header ========== //\n$header-height: 3.5rem;\n$header-height-mobile: 3rem;\n$header-border-top-width: 3px;\n$header-border-top-color: rgba(0, 0, 0, 0.75);\n$header-border-top-color-dark: rgba(0, 0, 0, 0.75);\n$header-banner-text-color: #333;\n$header-banner-text-color-dark: $text-color-primary-dark;\n\n// ========= sidebar ========= //\n$sidebar-width: 400px;\n\n// ========== profile ========== //\n$profile-width: 200px;\n\n// ========== index ========== //\n$index-post-link-color: #1f1f1f;\n$index-post-link-color-dark: #ccc;\n$index-post-tag-color: #aaa;\n$index-post-tag-color-dark: $text-color-minor-dark;\n\n// ===== abstract content ===== //\n$abstract-content-title-color: #333;\n$abstract-content-title-color-dark: $text-color-primary-dark;\n$abstract-content-text-color: #585858;\n$abstract-content-text-color-dark: $text-color-secondary-dark;\n$abstract-post-meta-color: #aaa;\n$abstract-post-meta-color-dark: $text-color-minor-dark;\n\n// ========== post ========== //\n$post-content-color: #23394d;\n$post-content-color-dark: $text-color-primary-dark;\n\n// ========== social ========== //\n$social-iconfont-color: #777;\n$social-iconfont-color-dark: #777;\n\n// ========== code ========== //\n$code-color-map: (\n 'atom-one-light': (\n base: #fafafa,\n mono-1: #383a42,\n mono-2: #686b77,\n mono-3: #a0a1a7,\n hue-1: #0184bb,\n hue-2: #4078f2,\n hue-3: #a626a4,\n hue-4: #50a14f,\n hue-5: #e45649,\n hue-5-2: #c91243,\n hue-6: #986801,\n hue-6-2: #c18401,\n ),\n 'atom-one-dark': (\n base: #282c34,\n mono-1: #abb2bf,\n mono-2: #818896,\n mono-3: #5c6370,\n hue-1: #56b6c2,\n hue-2: #61aeee,\n hue-3: #c678dd,\n hue-4: #98c379,\n hue-5: #e06c75,\n hue-5-2: #be5046,\n hue-6: #d19a66,\n hue-6-2: #e6c07b,\n ),\n);\n@if not(map-has-key($code-color-map, $code-theme)) {\n $code-theme: 'atom-one-dark';\n}\n$theme-colors: map-get($code-color-map, $code-theme);\n\n// ========== algolia-search ========== //\n$algolia-search-padding-horiz: 20px;\n","/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\n/**\n * 1. Set default font family to sans-serif.\n * 2. Prevent iOS text size adjust after orientation change, without disabling\n * user zoom.\n */\n\nhtml {\n -ms-text-size-adjust: 100%; /* 2 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/**\n * Remove default margin.\n */\n\nbody {\n margin: 0;\n}\n\n/* HTML5 display definitions\n ========================================================================== */\n\n/**\n * Correct `block` display not defined for any HTML5 element in IE 8/9.\n * Correct `block` display not defined for `details` or `summary` in IE 10/11\n * and Firefox.\n * Correct `block` display not defined for `main` in IE 11.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n/**\n * 1. Correct `inline-block` display not defined in IE 8/9.\n * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n */\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; /* 1 */\n vertical-align: baseline; /* 2 */\n}\n\n/**\n * Prevent modern browsers from displaying `audio` without controls.\n * Remove excess height in iOS 5 devices.\n */\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n/**\n * Address `[hidden]` styling not present in IE 8/9/10.\n * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n */\n\n[hidden],\ntemplate {\n display: none;\n}\n\n/* Links\n ========================================================================== */\n\n/**\n * Remove the gray background color from active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * Improve readability when focused and also mouse hovered in all browsers.\n */\n\na:active,\na:hover {\n outline: 0;\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n */\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n/**\n * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n */\n\nb,\nstrong {\n font-weight: bold;\n}\n\n/**\n * Address styling not present in Safari and Chrome.\n */\n\ndfn {\n font-style: italic;\n}\n\n/**\n * Address variable `h1` font-size and margin within `section` and `article`\n * contexts in Firefox 4+, Safari, and Chrome.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/**\n * Address styling not present in IE 8/9.\n */\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n/**\n * Address inconsistent and variable font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` affecting `line-height` in all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove border when inside `a` element in IE 8/9/10.\n */\n\nimg {\n border: 0;\n}\n\n/**\n * Correct overflow not hidden in IE 9/10/11.\n */\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * Address margin not present in IE 8/9 and Safari.\n */\n\nfigure {\n margin: 1em 40px;\n}\n\n/**\n * Address differences between Firefox and other browsers.\n */\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n/**\n * Contain overflow in all browsers.\n */\n\npre {\n overflow: auto;\n}\n\n/**\n * Address odd `em`-unit font size rendering in all browsers.\n */\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * Known limitation: by default, Chrome and Safari on OS X allow very limited\n * styling of `select`, unless a `border` property is set.\n */\n\n/**\n * 1. Correct color not being inherited.\n * Known issue: affects color of disabled elements.\n * 2. Correct font properties not being inherited.\n * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; /* 1 */\n font: inherit; /* 2 */\n margin: 0; /* 3 */\n}\n\n/**\n * Address `overflow` set to `hidden` in IE 8/9/10/11.\n */\n\nbutton {\n overflow: visible;\n}\n\n/**\n * Address inconsistent `text-transform` inheritance for `button` and `select`.\n * All other form control elements do not inherit `text-transform` values.\n * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n * Correct `select` style inheritance in Firefox.\n */\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/**\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n * and `video` controls.\n * 2. Correct inability to style clickable `input` types in iOS.\n * 3. Improve usability and consistency of cursor style between image-type\n * `input` and others.\n */\n\nbutton,\nhtml input[type=\"button\"], /* 1 */\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; /* 2 */\n cursor: pointer; /* 3 */\n}\n\n/**\n * Re-set default cursor for disabled elements.\n */\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n/**\n * Remove inner padding and border in Firefox 4+.\n */\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n/**\n * Address Firefox 4+ setting `line-height` on `input` using `!important` in\n * the UA stylesheet.\n */\n\ninput {\n line-height: normal;\n}\n\n/**\n * It's recommended that you don't attempt to style these elements.\n * Firefox's implementation doesn't respect box-sizing, padding, or width.\n *\n * 1. Address box sizing set to `content-box` in IE 8/9/10.\n * 2. Remove excess padding in IE 8/9/10.\n */\n\ninput[type='checkbox'],\ninput[type='radio'] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Fix the cursor style for Chrome's increment/decrement buttons. For certain\n * `font-size` values of the `input`, it causes the cursor style of the\n * decrement button to change from `default` to `text`.\n */\n\ninput[type='number']::-webkit-inner-spin-button,\ninput[type='number']::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Address `appearance` set to `searcherfield` in Safari and Chrome.\n * 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n * (include `-moz` to future-proof).\n */\n\ninput[type='searcher'] {\n -webkit-appearance: textfield; /* 1 */\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; /* 2 */\n box-sizing: content-box;\n}\n\n/**\n * Remove inner padding and searcher cancel button in Safari and Chrome on OS X.\n * Safari (but not Chrome) clips the cancel button when the searcher input has\n * padding (and `textfield` appearance).\n */\n\ninput[type='searcher']::-webkit-searcher-cancel-button,\ninput[type='searcher']::-webkit-searcher-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * Define consistent border, margin, and padding.\n */\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n/**\n * 1. Correct `color` not being inherited in IE 8/9/10/11.\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\n */\n\nlegend {\n border: 0; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Remove default vertical scrollbar in IE 8/9/10/11.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * Don't inherit the `font-weight` (applied by a rule above).\n * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n */\n\noptgroup {\n font-weight: bold;\n}\n\n/* Tables\n ========================================================================== */\n\n/**\n * Remove most spacing between table cells.\n */\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","// ========== general style ========== //\nhtml {\n font-size: $base-font-size;\n font-family: $base-font-family;\n overflow-x: hidden;\n}\n\n* {\n font-family: inherit;\n}\n\nbody {\n z-index: 100;\n position: relative;\n background-color: $body-background-color;\n transition: $transition-animation;\n}\n\n.wrapper {\n z-index: 1;\n display: flex;\n flex-direction: column;\n width: 100%;\n min-height: 100%;\n transition: transform 0.3s ease-in;\n transform: translate3d(0, 0, 0);\n position: relative;\n box-shadow: -3px 0 2px 0 rgba(0, 0, 0, 0.6);\n}\n\n.wrapper-sidebar-active {\n transform: translate3d($sidebar-width, 0, 0);\n}\n\n.main {\n order: 1;\n width: 50%;\n min-width: 42.8125rem;\n flex-grow: 0;\n padding: 0 0 0 0;\n margin-left: 3rem;\n}\n\n.container {\n display: flex;\n padding: $container-margin-top 0 0 0;\n position: relative;\n background-color: $body-background-color;\n top: 0;\n left: 0;\n align-items: flex-start;\n justify-content: center;\n width: 100%;\n transition: $transition-animation;\n opacity: 1;\n transform: translate3d(0, 0, 0);\n}\n\n.container-unloaded {\n opacity: 0;\n transform: translate3d(0, 1rem, 0);\n}\n\na {\n text-decoration: none;\n}\n\nul,\nli {\n list-style-type: none;\n}\n\n// selection\n::selection {\n background: $selection-background-color;\n color: $selection-text-color;\n}\n\n.fancy-link {\n padding: 0 !important;\n margin: 0 !important;\n}\n\n// notes\n.note {\n margin: 1.5rem 0;\n padding: 1rem 1.5rem;\n border-left: 0.35rem solid;\n border-radius: 0.35rem;\n transition: $transition-animation;\n\n .title {\n font-weight: bold;\n margin-top: 1rem;\n }\n\n &.note-warning {\n background-color: #fdf8ea;\n border-color: #f0ad4e;\n }\n}\n","// ========== fixed footer ========== //\n.footer-fixed {\n position: fixed;\n bottom: 0;\n width: 100%;\n height: $footer-fixed-height;\n overflow: hidden;\n z-index: 10;\n transform: translate3d(0, 0, 0);\n transition: transform 0.3s ease-in 0s;\n // Avoid blocking the click events of lower z-index elements\n // In this case, you should set every other fixed footer element\n // that clickable `pointer-events: auto;`\n pointer-events: none;\n}\n\n.footer-fixed-element {\n pointer-events: auto;\n}\n\n.footer-fixed-sidebar-active {\n transform: translate3d($sidebar-width, 0, 0);\n}\n\n// ========== back top ========== //\n.back-top {\n position: fixed;\n display: block;\n top: 50%;\n transform: translate(0, -50%);\n transition: all 0.3s ease;\n font-family: 'iconfont-archer';\n left: 1rem;\n bottom: 1rem;\n z-index: 21;\n width: 1.5rem;\n height: 1.5rem;\n text-align: center;\n line-height: 1.5rem;\n border: 2px solid $body-background-color-dark;\n background-color: $body-background-color;\n cursor: pointer;\n &:hover {\n background-color: $body-background-color-dark;\n color: $body-background-color;\n }\n}\n\n.back-top-rounded {\n position: absolute;\n font-family: 'iconfont-archer';\n color: #333333;\n background-color: $body-background-color;\n width: 2.7rem;\n height: 2.7rem;\n line-height: 2.7rem;\n border: unset;\n border-radius: 50%;\n &:hover {\n color: $body-background-color;\n }\n}\n\n.back-top-hidden {\n pointer-events: none;\n opacity: 0;\n}\n","// ========== footer ========== //\n.footer {\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n padding: 4rem 0 1.5rem 0;\n margin: 0 auto;\n width: 100%;\n background-color: $body-background-color;\n transition: background-color 0.5s ease-out;\n .social {\n width: 50%;\n min-width: 42.8125rem;\n line-height: 2.5rem;\n margin: 0 auto;\n text-align: center;\n vertical-align: text-bottom;\n .iconfont-archer {\n position: relative;\n }\n @include social($scaleSize: 0.8, $spanMargin: 0.5rem);\n }\n}\n\n// ========== copyright ========== //≈\n.copyright {\n font-family: $feature-font-family;\n margin: 0.5rem auto;\n text-align: center;\n color: $social-iconfont-color;\n a {\n color: $feature-color;\n }\n}\n\n.power {\n position: relative;\n vertical-align: baseline;\n font-size: 1rem;\n padding: 0 0.2rem;\n}\n\n// ========== website approve ========== //≈\n.website-approve {\n font-size: 14px;\n font-family: $feature-font-family;\n margin: 0rem auto 0.5rem;\n text-align: center;\n color: $social-iconfont-color;\n a {\n color: $social-iconfont-color;\n }\n}\n\n.icp-approve {\n font-family: $feature-font-family;\n}\n\n.beian-img {\n position: relative;\n vertical-align: middle;\n padding: 0 0.2rem 0.3rem 0.2rem;\n}\n\n.beian-approve {\n font-family: $feature-font-family;\n}\n\n// ========== busuanzi ========== //≈\n.busuanzi-container {\n text-align: center;\n}\n\n#busuanzi_container_site_pv,\n#busuanzi_container_site_uv {\n display: block;\n text-align: center;\n font: 0.6rem $feature-font-family;\n color: #ddd;\n}\n","// ========== hover ========== //\n@mixin hover-line($height: 2px, $width: 98%, $color: $feature-color) {\n &::after {\n content: '';\n position: absolute;\n left: calc((100% - #{$width}) / 2);\n bottom: -15%;\n transition: all 0.15s ease-in;\n width: $width;\n height: $height;\n transform: translate(0, 0);\n background-color: $color;\n opacity: 0;\n }\n &:hover::after {\n transform: translate(0, -2px);\n opacity: 1;\n }\n}\n\n// ========== social style ========== //\n@mixin social($scaleSize, $spanMargin) {\n .iconfont-archer {\n display: inline-block;\n text-align: center;\n }\n .iconfont-archer::before {\n display: inline-block;\n color: $social-iconfont-color;\n font-size: 3rem * $scaleSize;\n margin: 0 $spanMargin 0 0;\n }\n .iconfont-archer:last-of-child::before {\n margin: 0;\n }\n .email {\n top: 4px * $scaleSize;\n &::before {\n content: '\\e642';\n }\n &:hover::before {\n color: #0cb49d;\n }\n }\n .github {\n &::before {\n font-size: 3.2rem * $scaleSize;\n content: '\\e69f';\n }\n &:hover::before {\n color: #24292e;\n }\n }\n .wechat {\n top: 4px * $scaleSize;\n &::before {\n font-size: 2.8rem * $scaleSize;\n content: '\\ec7d';\n }\n &:hover::before {\n color: #42ae3c;\n }\n }\n .qq {\n top: 4px * $scaleSize;\n &::before {\n font-size: 2.8rem * $scaleSize;\n content: '\\e61d';\n }\n &:hover::before {\n color: #4f4e71;\n }\n }\n .telegram {\n top: 2.5px * $scaleSize;\n &::before {\n font-size: 2.6rem * $scaleSize;\n content: '\\e731';\n }\n &:hover::before {\n color: #36a1d3;\n }\n }\n .weibo {\n &::before {\n font-size: 3.2rem * $scaleSize;\n content: '\\e619';\n }\n &:hover::before {\n color: #d52a2a;\n }\n }\n .zhihu {\n top: 3px * $scaleSize;\n &::before {\n font-size: 2.7rem * $scaleSize;\n content: '\\e61a';\n }\n &:hover::before {\n color: #0f88eb;\n }\n }\n .douban {\n top: 2px * $scaleSize;\n &::before {\n font-size: 2.5rem * $scaleSize;\n content: '\\e605';\n }\n &:hover::before {\n color: #007711;\n }\n }\n .facebook {\n top: 5px * $scaleSize;\n &::before {\n font-size: 3rem * $scaleSize;\n content: '\\e67a';\n }\n &:hover::before {\n color: #3b5998;\n }\n }\n .twitter {\n top: 2px * $scaleSize;\n &::before {\n content: '\\e634';\n }\n &:hover::before {\n color: #1da1f2;\n }\n }\n .instagram {\n top: 4px * $scaleSize;\n &::before {\n content: '\\e79d';\n font-size: 2.8rem * $scaleSize;\n }\n &:hover::before {\n color: #8042b6;\n }\n }\n .stack-overflow {\n top: 1px * $scaleSize;\n &::before {\n font-size: 2.3rem * $scaleSize;\n content: '\\e80b';\n }\n &:hover::before {\n color: #f37f23;\n }\n }\n .segmentFault {\n top: 4px * $scaleSize;\n &::before {\n font-size: 3rem * $scaleSize;\n content: '\\e60c';\n }\n &:hover::before {\n color: #f37f23;\n }\n }\n .juejin {\n top: 1px * $scaleSize;\n &::before {\n font-size: 2.7rem * $scaleSize;\n content: '\\e60b';\n }\n &:hover::before {\n color: #f37f23;\n }\n }\n .v2ex {\n &::before {\n font-size: 2.2rem * $scaleSize;\n content: '\\e663';\n }\n &:hover::before {\n color: #171718;\n }\n }\n .bilibili {\n top: 6px * $scaleSize;\n &::before {\n font-size: 3.5rem * $scaleSize;\n content: '\\e64e';\n }\n &:hover::before {\n color: #2cb2f9;\n }\n }\n .linkedin {\n top: -1px * $scaleSize;\n &::before {\n font-size: 2.5rem * $scaleSize;\n content: '\\e695';\n }\n &:hover::before {\n color: #0077b5;\n }\n }\n .steam {\n top: 2px * $scaleSize;\n &::before {\n font-size: 2.5rem * $scaleSize;\n content: '\\f23b';\n }\n &:hover::before {\n color: #010101;\n }\n }\n .others {\n top: -1px * $scaleSize;\n &::before {\n font-size: 2.2rem * $scaleSize;\n content: '\\e64a';\n }\n &:hover::before {\n color: #8090b0;\n }\n }\n .rss {\n &::before {\n font-size: 2.1rem * $scaleSize;\n content: '\\e652';\n }\n &:hover::before {\n color: #e53935;\n }\n }\n}\n","// ========== header ========== //\nheader {\n &.header {\n position: fixed;\n top: 0;\n width: 100%;\n height: $header-height;\n overflow: hidden;\n z-index: 10;\n transform: translate3d(0, 0, 0);\n transition: transform 0.3s ease-in 0s;\n // Avoid blocking the click events of lower z-index elements\n // In this case, you should set every other clickable header element\n // with css attribute `pointer-events: auto;`\n pointer-events: none;\n }\n\n &.header-sidebar-active {\n transform: translate3d($sidebar-width, 0, 0);\n }\n\n .header-element {\n pointer-events: auto;\n }\n}\n\n// ========== post read progress ========== //\n.read-progress {\n width: 100%;\n position: absolute;\n top: 0;\n left: 0;\n height: $header-border-top-width;\n background-color: rgba(0, 0, 0, 0.7);\n transition: transform 0.1s ease-out, opacity 0.5s ease-in-out;\n transform: translate3d(-100%, 0, 0);\n opacity: 0;\n z-index: 99999;\n}\n\n.read-progress-feature {\n background-color: $feature-color;\n}\n\n// ========== header sidebar menu ========== //\n.header-sidebar-menu {\n position: absolute;\n left: 1rem;\n top: 50%;\n border: 2px solid $body-background-color;\n width: 1.5rem;\n height: 1.5rem;\n transform: translate(0, -50%);\n transition: all 0.3s ease;\n font-family: 'iconfont-archer';\n color: $body-background-color;\n text-align: center;\n line-height: 1.5rem;\n z-index: 21;\n cursor: pointer;\n &:hover {\n background-color: $body-background-color;\n color: $body-background-color-dark;\n transform: translate(0, -50%);\n }\n}\n\n.header-sidebar-menu-rounded {\n font-family: unset;\n transform: translate(0, -50%);\n width: 2.7rem;\n height: 2.7rem;\n line-height: 2.7rem;\n border: unset;\n border-radius: 50%;\n &:hover {\n background-color: transparent;\n color: $feature-color;\n }\n}\n\n.header-sidebar-menu-active {\n transform: translate(0, -50%) rotate(180deg) !important;\n}\n\n.header-sidebar-menu-black {\n color: $body-background-color-dark;\n background-color: $body-background-color;\n border-color: $body-background-color-dark;\n &:hover {\n background-color: $body-background-color-dark;\n color: $body-background-color;\n }\n}\n\n// ========== header actions ========== //\n.header-actions {\n position: absolute;\n right: 1rem;\n line-height: 2.7rem;\n top: 50%;\n transform: translate(0, -50%);\n\n &.header-actions-hide {\n display: none;\n }\n\n > span {\n margin-left: 1rem;\n padding: 0.5rem;\n }\n\n // ========== theme mode switch button ========== //\n .header-theme-btn {\n color: #fff;\n cursor: pointer;\n\n &:hover {\n color: $feature-color;\n }\n\n &-disabled {\n pointer-events: none;\n }\n }\n\n // ========== home page link ========== //\n .home-link {\n font-family: $feature-font-family;\n\n a {\n color: #fff;\n &:hover {\n color: $feature-color;\n }\n }\n }\n}\n\n// ========== header toggle (only take effect in post page) ========== //\n// banner\n.banner {\n position: relative;\n width: 100%;\n margin: 0 auto;\n height: calc(100% - 1px);\n border-bottom: 1px solid rgba(0, 0, 0, 0.8);\n background-color: rgba(255, 255, 255, 0.8);\n transform: translate3d(0, -100%, 0);\n transition: transform 0.3s ease 0s;\n\n .post-title {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n width: 70%;\n margin-left: 15%;\n\n a {\n white-space: nowrap;\n color: $header-banner-text-color;\n max-width: 100%;\n text-overflow: ellipsis;\n overflow: hidden;\n text-align: center;\n font-size: 1.5rem;\n }\n\n &.post-title-hide {\n display: none;\n }\n }\n\n .blog-title {\n display: flex;\n position: absolute;\n right: 1.5rem;\n line-height: 2.7rem;\n top: 50%;\n transform: translate(0, -50%);\n justify-content: center;\n align-items: center;\n height: 100%;\n a {\n vertical-align: top;\n white-space: nowrap;\n color: $header-banner-text-color;\n font: 1rem/1rem $feature-font-family;\n &:hover {\n color: $feature-color;\n }\n }\n }\n\n &.banner-show {\n transform: translate3d(0, 0, 0);\n }\n\n &.banner-clean {\n border-bottom: unset;\n background-color: rgba(255, 255, 255, 0.9);\n }\n}\n","// ========== intro image ========== //\n.site-intro-img {\n position: absolute;\n z-index: -1;\n top: 0;\n left: 0;\n height: calc(100% + 1px);\n width: 100%;\n filter: brightness(0.5);\n background-repeat: no-repeat;\n background-position: center center;\n background-size: cover;\n background-color: transparent;\n}\n\n// ========== intro placeholder ========== //\n// 在layout中 //\n// ========== main intro meta ========== //\n.site-intro-meta {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n}\n\n.intro-title,\n.intro-subtitle {\n font-family: $feature-font-family;\n color: #fff;\n margin: 0;\n opacity: 0;\n transition: $transition-animation;\n transform: translate(0, -1rem);\n}\n\n.intro-title {\n font-size: 4rem;\n}\n\n.intro-subtitle {\n font-size: 2rem;\n margin-top: 0.5rem;\n transition-delay: 0.5s;\n}\n\n.intro-fade-in {\n opacity: 1;\n transform: translate(0, 0);\n}\n\n.home-body {\n .intro-title,\n .intro-subtitle {\n text-align: center;\n margin-top: 0;\n }\n}\n","// ========== paginator ========== //\n.page-nav {\n padding: 1rem 0 0.5rem 0;\n display: flex;\n justify-content: center;\n & > * {\n font: 1.4rem $feature-font-family;\n color: #252525;\n vertical-align: middle;\n margin-right: 0.5rem;\n text-align: center;\n }\n a {\n position: relative;\n color: #ccc;\n overflow: visible;\n @include hover-line($color: #ccc);\n }\n}\n","// ========== profile ========== //\n.profile {\n padding-top: 1rem;\n order: 0;\n vertical-align: top;\n flex-shrink: 0;\n width: $profile-width;\n font: 1rem $feature-font-family;\n color: $social-iconfont-color;\n // 为了在没有social和friends时也显示一个分割线\n border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n a {\n transition: color 0.1s ease-in;\n }\n & > *:last-child {\n border-bottom: none;\n }\n}\n\n.profile.profile-sticky {\n position: sticky;\n top: $header-height;\n}\n\n.profile-avatar {\n display: block;\n border-radius: 1rem;\n width: 100%;\n border: 1px solid rgba(0, 0, 0, 0.1);\n\n &.hide-border {\n border: unset;\n }\n}\n\n.profile-name {\n font-size: 2rem;\n line-height: 3rem;\n padding: 0.5rem 0 0 0;\n color: #333;\n text-align: center;\n}\n\n.profile-signature {\n font-size: 1rem;\n text-align: center;\n}\n\n.profile-social {\n position: relative;\n width: 100%;\n text-align: left;\n line-height: 1.7rem;\n padding: 0.5rem 0;\n border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n .iconfont-archer {\n position: relative;\n }\n @include social($scaleSize: 0.5, $spanMargin: 0.4rem);\n}\n\n.wechat,\n.qq {\n cursor: pointer;\n &:hover {\n .profile-qr {\n opacity: 1;\n visibility: visible;\n }\n }\n}\n\n.profile-qr {\n visibility: hidden;\n position: absolute;\n left: 0;\n bottom: 2.5rem;\n border: 3px solid #fff;\n border-radius: 3px;\n z-index: 99;\n background-color: #fff;\n width: 7rem;\n padding: 0.5rem;\n opacity: 0;\n transition: all 0.1s ease-in 0s;\n}\n\n.friends {\n padding: 0.5rem 0;\n border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n text-align: left;\n div {\n font-size: 1.2rem;\n text-align: left;\n font-weight: bold;\n }\n a {\n margin-right: 0.6rem;\n color: $social-iconfont-color;\n &:hover {\n color: $feature-color;\n }\n }\n}\n\n.profile-link-item {\n padding: 0.5rem 0;\n border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n a {\n font-size: 1.2rem;\n font-weight: bold;\n color: $social-iconfont-color;\n &:hover {\n color: $feature-color;\n }\n }\n}\n\n.profile-item-icon {\n margin-right: 0.3rem;\n}\n\n.about-me {\n}\n\n.search-me {\n}\n","// ========== 设置滚动条的样式 (Webkit only) ========== //\nhtml,\n.sidebar-panel-archives,\n.sidebar-tags-name,\n.sidebar-categories-name,\n.sidebar-tags-list,\n.sidebar-categories-list,\n.highlight {\n &::-webkit-scrollbar {\n background-color: rgba(0, 0, 0, 0.5);\n width: 5px;\n }\n &::-webkit-scrollbar-corner {\n display: none;\n }\n &::-webkit-scrollbar-button {\n display: none;\n }\n &::-webkit-scrollbar-button:start:increment,\n &::-webkit-scrollbar-button:end:decrement {\n display: none;\n }\n &::-webkit-scrollbar-thumb {\n border-radius: 8px;\n background-color: rgba(0, 0, 0, 0.2);\n }\n &::-webkit-scrollbar-track,\n &::-webkit-scrollbar-thumb {\n border: none;\n }\n &::-webkit-scrollbar-thumb {\n background-color: rgba(255, 255, 255, 0.2);\n border-radius: 0px;\n }\n &::-webkit-scrollbar-track:hover {\n background-color: rgba(0, 0, 0, 0.1);\n }\n}\n\n// sidebar srcollbar\n.sidebar-archive,\n.sidebar-tags-name,\n.sidebar-categories-name,\n.sidebar-tags-list,\n.sidebar-categories-list {\n &::-webkit-scrollbar-thumb {\n border-radius: 8px;\n background-color: rgba(255, 255, 255, 0.7);\n }\n &::-webkit-scrollbar-thumb {\n background-color: rgba(255, 255, 255, 0.7);\n border-radius: 0px;\n }\n &::-webkit-scrollbar-track:hover {\n background-color: rgba(255, 255, 255, 0.7);\n }\n}\n\n// highlight\n.highlight {\n &::-webkit-scrollbar {\n height: 5px;\n }\n &::-webkit-scrollbar-thumb {\n border-radius: 8px;\n background-color: rgba(255, 255, 255, 0.3);\n }\n &::-webkit-scrollbar-thumb {\n background-color: rgba(255, 255, 255, 0.3);\n border-radius: 0px;\n }\n &::-webkit-scrollbar-track:hover {\n background-color: rgba(255, 255, 255, 0.3);\n }\n}\n",".popup {\n display: none;\n position: fixed;\n top: 10%;\n left: 50%;\n width: 700px;\n height: 80%;\n margin-left: -350px;\n padding: 3px 0 0 10px;\n background: #fff;\n color: #333;\n z-index: 9999;\n box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5);\n border-radius: 5px;\n}\n\n@media (max-width: 767px) {\n .popup {\n padding: 3px;\n top: 0;\n left: 0;\n margin: 0;\n width: 100%;\n height: 100%;\n border-radius: 0px;\n }\n}\n\n.popoverlay {\n position: fixed;\n width: 100%;\n height: 100%;\n top: 0px;\n left: 0px;\n z-index: 2080;\n background-color: rgba(0, 0, 0, 0.3);\n}\n\n.popup-btn-close {\n display: inline-block;\n color: $feature-color;\n cursor: pointer;\n .iconfont-archer {\n font-size: 20px;\n }\n}\n\n.algolia-popup {\n overflow: hidden;\n padding: 0;\n}\n\n.algolia-popup .popup-btn-close {\n padding: 10px;\n border-left: 1px solid #ddd;\n}\n\n.algolia-popup .popup-btn-close .fa {\n color: #999;\n font-size: 18px;\n}\n\n.algolia-popup .popup-btn-close:hover .fa {\n color: #222;\n}\n\n.algolia-search {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 5px;\n border-bottom: 1px solid #ccc;\n background: #f5f5f5;\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n}\n\n.algolia-search-input-icon {\n display: inline-block;\n width: 20px;\n padding: 0px 10px;\n}\n\n.algolia-search-input-icon .fa {\n font-size: 18px;\n}\n\n.algolia-search-input {\n display: inline-block;\n width: calc(90% - 20px);\n}\n\n.algolia-search-input input {\n padding: 5px 0;\n width: 100%;\n outline: none;\n border: none;\n background: transparent;\n}\n\n.algolia-powered {\n float: right;\n}\n\n.algolia-powered img {\n display: inline-block;\n height: 18px;\n vertical-align: middle;\n}\n\n.algolia-stats {\n margin-top: 20px;\n}\n\n.algolia-results {\n position: relative;\n overflow: auto;\n height: calc(100% - 50px);\n}\n\n.algolia-results hr {\n margin: 10px 0;\n}\n\n.algolia-results .highlight {\n font-style: normal;\n margin: 0;\n padding: 0 2px;\n font-size: inherit;\n color: #f00;\n}\n\n.algolia-stat-root {\n font-weight: lighter;\n color: #aaa;\n padding: {\n left: $algolia-search-padding-horiz;\n right: $algolia-search-padding-horiz;\n }\n}\n\n.algolia-hits {\n margin-top: 20px;\n}\n\n.algolia-hit {\n &-list {\n padding-left: 0;\n }\n\n &-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n margin-top: 4em;\n &-label {\n margin-top: 1em;\n }\n }\n\n &-item {\n margin: 0;\n --border-opacity: 1;\n padding: 10px $algolia-search-padding-horiz;\n border: {\n bottom: 1px dashed;\n color: rgba(245, 245, 250, var(--border-opacity));\n }\n cursor: pointer;\n &:hover {\n background: #eee;\n border-color: transparent;\n }\n\n &-link {\n color: #555;\n padding: 0 0 2px 0;\n display: block;\n transition-duration: 0.2s;\n transition-timing-function: ease-in-out;\n transition-delay: 0s;\n em {\n font-style: normal;\n color: $feature-color;\n }\n }\n }\n}\n\n// ===== pagination ===== //\n.ais-Pagination-list {\n display: flex;\n justify-content: center;\n padding: 0;\n margin: 20px 0;\n border-top: none;\n}\n\n.ais-Pagination-item {\n a {\n color: $feature-color;\n }\n display: inline-block;\n margin: 0 5px;\n\n &--active {\n a {\n pointer-events: none;\n cursor: auto;\n color: #222;\n }\n }\n &--page {\n border-top: none;\n &:hover {\n border-bottom: 1px solid #222;\n }\n }\n}\n\n.algolia-pop-overlay {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n bottom: 0;\n z-index: 50;\n}\n","// ========== code style ========== //\n.abstract-content,\n.article-entry {\n // ========== toggle ========== //\n pre,\n .highlight {\n margin: 0.8rem 0;\n padding: 0.7rem 0.7rem;\n overflow: auto;\n font-size: 0.9rem;\n line-height: 1.3rem;\n }\n .highlight .gutter pre,\n .highlight .gutter pre .line,\n .gist .gist-file .gist-data .line-numbers {\n color: #666;\n }\n pre,\n code {\n font-family: 'Source Code Pro', Consolas, Menlo, Monaco, 'Courier New',\n monospace;\n font-weight: 400;\n }\n code {\n background: #eee;\n padding: 1px 0.4rem;\n border-radius: 2px;\n margin: 0 0.2rem;\n border: none;\n transition: $transition-animation;\n }\n pre code {\n background: none;\n text-shadow: none;\n padding: 0;\n color: #657b83;\n }\n .highlight {\n border-radius: 4px;\n }\n .highlight pre {\n border: none;\n margin: 0;\n padding: 0;\n }\n .highlight table {\n margin: 0;\n width: auto;\n }\n .highlight td {\n border: none;\n padding: 0;\n }\n .highlight figcaption {\n color: highlight-comment;\n line-height: 1em;\n margin-bottom: 1em;\n }\n .highlight figcaption:before,\n .highlight figcaption:after {\n content: '';\n display: table;\n }\n .highlight figcaption:after {\n clear: both;\n }\n .highlight figcaption a {\n float: right;\n }\n .highlight .gutter pre {\n text-align: right;\n padding-right: 20px;\n }\n .highlight .gutter pre .line {\n text-shadow: none;\n }\n .highlight .line {\n min-height: 19px;\n }\n\n // ========== code color ========== //\n .highlight,\n pre {\n color: map-get($theme-colors, 'mono-1');\n background: map-get($theme-colors, 'base');\n }\n .highlight {\n pre .comment,\n pre .quote {\n color: map-get($theme-colors, 'mono-3');\n font-style: italic;\n }\n\n pre .doctag,\n pre .keyword,\n pre .formula {\n color: map-get($theme-colors, 'hue-3');\n }\n\n pre .section,\n pre .name,\n pre .selector-tag,\n pre .deletion,\n pre .subst {\n color: map-get($theme-colors, 'hue-5');\n }\n\n pre .literal {\n color: map-get($theme-colors, 'hue-1');\n }\n\n pre .string,\n pre .regexp,\n pre .addition,\n pre .attribute,\n pre .meta-string {\n color: map-get($theme-colors, 'hue-4');\n }\n\n pre .built_in,\n pre .class pre .title {\n color: map-get($theme-colors, 'hue-6-2');\n }\n\n pre .attr,\n pre .variable,\n pre .template-variable,\n pre .type,\n pre .selector-class,\n pre .selector-attr,\n pre .selector-pseudo,\n pre .number {\n color: map-get($theme-colors, 'hue-6');\n }\n\n pre .symbol,\n pre .bullet,\n pre .link,\n pre .meta,\n pre .selector-id,\n pre .title {\n color: map-get($theme-colors, 'hue-2');\n }\n\n pre .emphasis {\n font-style: italic;\n }\n\n pre .strong {\n font-weight: bold;\n }\n\n pre .link {\n text-decoration: underline;\n }\n }\n\n // ========== gist ========== //\n .gist {\n margin: 0 -20px;\n border-style: solid;\n border-color: #ddd;\n border-width: 1px 0;\n background: #272822;\n padding: 15px 20px 15px 0;\n }\n .gist .gist-file {\n border: none;\n font-family: 'Source Code Pro', Consolas, Monaco, Menlo, Consolas, monospace;\n margin: 0;\n }\n .gist .gist-file .gist-data {\n background: none;\n border: none;\n }\n .gist .gist-file .gist-data .line-numbers {\n background: none;\n border: none;\n padding: 0 20px 0 0;\n }\n .gist .gist-file .gist-data .line-data {\n padding: 0 !important;\n }\n .gist .gist-file .highlight {\n margin: 0;\n padding: 0;\n border: none;\n }\n .gist .gist-file .gist-meta {\n background: #272822;\n color: highlight-comment;\n font: 0.85em 'Helvetica Neue', Helvetica, Arial, sans-serif;\n text-shadow: 0 0;\n padding: 0;\n margin-top: 1em;\n margin-left: 20px;\n }\n .gist .gist-file .gist-meta a {\n color: #258fb8;\n font-weight: normal;\n }\n .gist .gist-file .gist-meta a:hover {\n text-decoration: underline;\n }\n}\n",".archer- {\n &float-left {\n float: left;\n margin-right: 1rem;\n }\n &float-right {\n float: right;\n margin-left: 1rem;\n }\n}\n","// ========== sidebar archive ========== //\n.sidebar-panel-archives {\n padding: 1rem;\n ul {\n padding: 0;\n margin: 0;\n }\n}\n\n.ps__rail-x,\n.ps__rail-y {\n display: none !important;\n}\n\n.post-archive {\n overflow-y: auto;\n}\n\n.archive-post-item {\n font-family: $base-font-family;\n display: flex;\n align-items: baseline;\n border-left: 1px solid #bbb;\n margin-left: 0.3rem;\n padding: 0.2rem 0 0.3rem 0.5rem;\n &:hover {\n border-left-color: $feature-color;\n .archive-post-date,\n .archive-post-title {\n color: $feature-color;\n }\n }\n}\n\n.total-and-search {\n display: flex;\n}\n\n.site-search {\n &.site-search-loading {\n display: none;\n }\n\n .search-icon {\n cursor: pointer;\n color: $feature-color;\n line-height: 2.3rem;\n font-size: 1.4rem;\n position: relative;\n margin-left: 0.5rem;\n }\n}\n\n.archive-year,\n.total-archive {\n font: 1.2rem $feature-font-family;\n color: $feature-color;\n}\n\n.archive-year {\n font-size: 1rem;\n margin: 0.3rem 0 0.3rem 0;\n}\n\n.archive-post-date {\n // align-self: center;\n font: 0.9rem/1rem $feature-font-family;\n color: #999;\n}\n\n.archive-post-title {\n font-size: 1rem;\n line-height: 1.4rem;\n margin-left: 0.8rem;\n text-align: left;\n color: #ccc;\n}\n","// ========== sidebar tags ========== //\n.sidebar-panel-tags,\n.sidebar-panel-categories {\n padding: 1rem 1rem 5px 1rem;\n position: relative;\n display: flex;\n flex-direction: column;\n}\n\n.sidebar-tags-name,\n.sidebar-categories-name {\n flex-grow: 0;\n width: 100%;\n padding: 0 0 1rem 0;\n max-height: 28rem;\n overflow: auto;\n}\n\n.sidebar-tag-name,\n.sidebar-category-name {\n display: inline-block;\n border: 1px solid #fff;\n border-radius: 5rem;\n padding: 0.07rem 0.4rem 0.1rem 0.4rem;\n margin: 0.2rem 0;\n white-space: nowrap;\n font-size: 1rem;\n cursor: pointer;\n color: #fff;\n &:hover {\n border-color: $feature-color;\n color: $feature-color;\n }\n .iconfont-archer {\n pointer-events: none;\n transform: translateY(-1rem);\n font-size: 0.6rem;\n margin: 0 0.3rem 0 0.1rem;\n }\n}\n\n.sidebar-category-name {\n .iconfont-archer {\n font-size: 16px;\n }\n}\n\n.sidebar-tags-empty,\n.sidebar-categories-empty {\n display: none;\n}\n\n.sidebar-tags-empty-active,\n.sidebar-categories-empty-active {\n display: block;\n font-size: 6rem !important; // TODO: why does it need !important\n margin-top: 7rem;\n user-select: none;\n text-align: center;\n color: #fff;\n}\n\n.sidebar-label-focus {\n border-color: $feature-color;\n color: $feature-color;\n}\n\n.sidebar-tags-list,\n.sidebar-categories-list {\n flex-grow: 1;\n padding: 1rem 1rem 0 0;\n overflow-y: auto;\n}\n\n.meta-post-item {\n @extend .archive-post-item;\n}\n\n.meta-post-title {\n @extend .archive-post-title;\n}\n\n.meta-post-date {\n @extend .archive-post-date;\n}\n","// ========== sidebar ========== //\n.sidebar {\n position: fixed;\n display: flex;\n flex-direction: column;\n left: 0;\n top: 0;\n z-index: -9999;\n height: 100%;\n width: $sidebar-width;\n transition: all 0.3s ease-in 0s;\n overflow-x: hidden;\n background-color: #222;\n}\n\n.sidebar-hide {\n display: none;\n}\n\n// ========== sidebar header ========== //\n.sidebar-tabs {\n display: flex;\n position: relative;\n padding: 0;\n margin: 0;\n height: 4rem;\n width: 100%;\n z-index: 1001;\n justify-content: space-around;\n align-items: flex-start;\n font-family: $feature-font-family;\n flex-grow: 0;\n color: #eee;\n border-bottom: 2px solid #666;\n &::after {\n content: '';\n position: absolute;\n width: 33.33%;\n height: 2px;\n left: 0;\n top: 100%;\n background-color: $feature-color;\n transform: translate3d(0, 0, 0);\n transition: transform 0.2s ease-out 0s;\n }\n}\n\n.sidebar-tab-archives,\n.sidebar-tab-tags,\n.sidebar-tab-categories {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.3rem;\n width: 33.33%;\n height: 100%;\n cursor: pointer;\n .iconfont-archer {\n pointer-events: none;\n margin: 0 0.5rem 0 0rem;\n font-size: 1.5rem;\n }\n}\n\n.tab-name {\n pointer-events: none;\n font-size: 1.5rem;\n margin-left: 0.2rem;\n}\n\n.sidebar-tabs-active-0 {\n &::after {\n transform: translate3d(0, 0, 0);\n }\n}\n\n.sidebar-tabs-active-1 {\n &::after {\n transform: translate3d(100%, 0, 0);\n }\n}\n\n.sidebar-tabs-active-2 {\n &::after {\n transform: translate3d(200%, 0, 0);\n }\n}\n\n// ========== sidebar content ========== //\n.sidebar-content {\n position: relative;\n display: flex;\n width: 300%;\n height: calc(100% - 4rem);\n top: 0;\n left: 0;\n overflow-x: hidden;\n transition: transform 0.3s ease-out 0s;\n transform: translate3d(0, 0, 0);\n}\n\n.sidebar-panel-archives,\n.sidebar-panel-tags,\n.sidebar-panel-categories {\n overflow-x: hidden;\n overflow-y: auto;\n flex-shrink: 0;\n width: calc(33.33% - 2rem);\n -webkit-overflow-scrolling: touch;\n}\n\n.sidebar-content-active-0 {\n transform: translate3d(0, 0, 0);\n}\n\n.sidebar-content-active-1 {\n transform: translate3d(-33.33%, 0, 0);\n}\n\n.sidebar-content-active-2 {\n transform: translate3d(-66.67%, 0, 0);\n}\n","// ========== main ========== //\n.index-post {\n background-color: $foreground-color;\n border-radius: 0.5rem;\n position: relative;\n padding: 1rem;\n z-index: 3;\n transition: background-color 0.5s ease-out;\n}\n\n// ========== abstract content ========== //\n.index-post {\n .abstract-content {\n color: $abstract-content-text-color;\n font-size: 1rem;\n font-weight: 300;\n word-break: break-word;\n img {\n max-height: 60vh;\n box-shadow: none;\n }\n @for $i from 1 through 6 {\n h#{$i} {\n font-weight: normal;\n .headerlink,\n .anchorjs-link {\n display: none;\n }\n }\n }\n }\n}\n\n// ========== abstract title ========== //\n.abstract-title {\n display: flex;\n align-items: baseline;\n line-height: 2.5rem;\n margin-bottom: 0.5rem;\n transition: color 0.1s ease-in;\n color: $abstract-content-title-color;\n &:hover {\n color: $feature-color;\n }\n\n .stick-top {\n font-size: 1.3rem;\n margin-right: 0.5rem;\n }\n\n .abstract-title-text {\n font-size: 1.7rem;\n }\n}\n\n// ========== abstract read more button ========== //\n.index-post {\n .abstract-read-more-button {\n font-family: $feature-font-family;\n font-size: 1rem;\n\n a {\n color: $abstract-post-meta-color;\n padding-top: 1rem;\n display: flex;\n justify-content: flex-end;\n align-items: center;\n transition: color 0.1s ease-in;\n &:hover {\n color: $feature-color;\n }\n }\n }\n}\n\n// ========== abstract meta ========== //\n.abstract-post-meta {\n display: flex;\n justify-content: space-between;\n margin-top: 1rem;\n font-size: 1rem;\n font-family: $feature-font-family;\n color: $abstract-post-meta-color;\n\n a {\n color: $abstract-post-meta-color;\n }\n\n .abstract-calander {\n position: relative;\n top: -0.1rem;\n margin-right: 0.3rem;\n }\n\n .abstract-tags {\n text-align: right;\n }\n\n .post-category {\n cursor: pointer;\n position: relative;\n margin-left: 0.4rem;\n font-weight: lighter;\n @include hover-line($color: $abstract-post-meta-color);\n }\n\n .post-category-icon {\n margin-right: 2px;\n pointer-events: none;\n }\n\n .post-category-text {\n pointer-events: none;\n }\n\n .post-tag {\n position: relative;\n margin-left: 0.4rem;\n font-weight: lighter;\n &::before {\n margin-right: 2px;\n content: '#';\n }\n @include hover-line($color: $abstract-post-meta-color);\n }\n}\n\n// ========== divider ========== //\n.index-post-divider {\n margin: 0.5rem;\n border-bottom: 1px dashed rgba(0, 0, 0, 0.2);\n}\n","// ========== main ========== //\n.post-body,\n.about-body {\n main {\n margin: 0;\n }\n}\n\n.anchorjs-archer {\n color: $feature-color;\n border: none !important;\n}\n\n// ========== intro ========== //\n.post-body,\n.about-body {\n .site-intro-meta {\n width: 50%;\n min-width: 42.8125rem;\n margin: 0 auto;\n align-items: flex-start;\n }\n .intro-title {\n font: 4rem/5.3rem $feature-font-family;\n color: #fff;\n margin: 0;\n }\n}\n\n.post-intros {\n opacity: 0;\n transition: $transition-animation 0.5s;\n transform: translate3d(0, -1rem, 0);\n}\n\n.post-intro-tags {\n font: 1.2rem $feature-font-family;\n color: #fff;\n\n a {\n color: #fff;\n }\n\n .post-category {\n cursor: pointer;\n position: relative;\n margin-left: 0;\n margin-right: 0.5rem;\n @include hover-line($color: #fff);\n }\n\n .post-category-icon {\n margin-right: 2px;\n pointer-events: none;\n }\n\n .post-category-text {\n pointer-events: none;\n }\n\n .post-tag {\n position: relative;\n margin-left: 0;\n margin-right: 0.5rem;\n @include hover-line($color: #fff);\n &::before {\n margin-right: 2px;\n content: '#';\n }\n }\n}\n\n.post-intro-meta {\n margin-top: 0.2rem;\n font: 1.1rem $feature-font-family;\n color: rgba(255, 255, 255, 1);\n display: flex;\n align-items: center;\n}\n\n.post-intro-read {\n margin-top: 0.2rem;\n font: 0.9rem $feature-font-family;\n color: rgba(255, 255, 255, 1);\n display: flex;\n align-items: center;\n}\n\n.word-count {\n margin-right: 1rem;\n}\n\n.post-fade-in {\n opacity: 1;\n transform: translate3d(0, 0, 0);\n}\n\n.post-intro-calander {\n font-size: 0.9rem !important;\n margin-right: 0.3rem;\n}\n\n.post-intro-time {\n font-size: 0.9rem;\n margin-right: 0.5rem;\n}\n\n.busuanzi-pv,\n.busuanzi-uv {\n font-size: 0.9rem;\n margin-right: 0.4rem;\n}\n\n.post-intro-busuanzi {\n font-size: 0.9rem !important;\n}\n\n.share-wrapper {\n position: relative;\n font-size: 0.9rem;\n padding: 0 0.5rem 0 0;\n}\n\n.share-wrapper:hover {\n .share-list {\n visibility: visible;\n opacity: 1;\n }\n}\n\n.share-icon {\n font-size: 0.9rem !important;\n cursor: pointer;\n}\n\n.share-text {\n font-family: $feature-font-family;\n cursor: pointer;\n}\n\n.share-list {\n position: absolute;\n visibility: hidden;\n margin: 0;\n padding: 0;\n left: 100%;\n bottom: 0;\n display: flex;\n opacity: 0;\n transition: all 0.1s ease-in 0s;\n}\n\n.share-list .iconfont-archer {\n display: inline-block;\n margin-right: 3px;\n cursor: pointer;\n &:hover {\n color: #aaa;\n }\n}\n\n.share-list [data-type='weibo'] {\n position: relative;\n top: -2px;\n}\n\n.share-list [data-type='facebook'] {\n position: relative;\n top: 1px;\n}\n\n.share-qr {\n position: relative;\n}\n\n.share-qrcode {\n position: absolute;\n left: 0;\n bottom: 1.5rem;\n visibility: hidden;\n opacity: 0;\n transition: all 0.1s ease-in 0s;\n}\n\n.share-qr:hover {\n .share-qrcode {\n visibility: visible;\n opacity: 1;\n }\n}\n\n// ========== paginator ========== //\n.post-paginator {\n overflow: hidden;\n margin: 0;\n list-style: none;\n padding: 2.5rem 0 1rem 0;\n display: flex;\n justify-content: space-between;\n li {\n position: relative;\n max-width: 13rem;\n }\n\n .nextTitle,\n .prevTitle {\n font-size: 1.2rem;\n color: #ccc;\n &:hover {\n color: $feature-color;\n }\n }\n\n .nextSlogan,\n .prevSlogan {\n font: bold 1.4rem $feature-font-family;\n color: #252525;\n }\n\n .nextSlogan {\n &::before {\n content: '< ';\n font-size: 1.7rem;\n }\n }\n\n .prevSlogan {\n &::after {\n content: ' >';\n font-size: 1.7rem;\n }\n }\n\n .prevTitle,\n .prevSlogan {\n text-align: right;\n }\n}\n\n// ========== content ========== //\n.article-entry {\n background-color: $foreground-color;\n border-radius: 0.5rem 0.5rem 0 0;\n padding: 0.5rem 1.5rem;\n transition: background-color 0.5s ease-out;\n overflow: hidden;\n}\n\n.abstract-content,\n.article-entry {\n position: relative;\n font-weight: lighter;\n font-weight: 400;\n color: $post-content-color;\n li {\n word-wrap: break-all;\n line-height: 1.625;\n }\n ul,\n ul li {\n list-style-type: initial;\n margin-top: 0.25em;\n }\n ol,\n ol li {\n list-style-type: decimal-leading-zero;\n margin-top: 0.25em;\n }\n @for $i from 1 through 6 {\n h#{$i} {\n .headerlink {\n display: none;\n }\n }\n }\n // @for $i from 2 through 4 {\n // h#{$i} {\n // // &::before {\n // // content: \"#\";\n // // margin-right: 2px;\n // // color: $feature-color;\n // // font: 1em $base-font-family;\n // // font-weight: bold;\n // // }\n // }\n // }\n // h1 {\n // }\n // h2 {\n // }\n // h3 {\n // }\n // h4 {\n // }\n h5 {\n font-size: 1rem;\n margin: 1rem 0;\n }\n h6 {\n font-size: 0.8rem;\n margin: 1rem 0;\n }\n p {\n line-height: 1.625;\n }\n em {\n font-style: italic;\n }\n img {\n display: block;\n max-width: 100%;\n margin: 1rem auto 1rem;\n box-shadow: 0 0 4px 2px rgba(0, 0, 0, 0.2);\n }\n blockquote {\n margin: 1.5em 0;\n padding: 1rem 1.5rem;\n position: relative;\n background-color: #f6f6f6;\n border-left: 0.35rem solid $feature-color;\n border-radius: 0.35rem;\n transition: $transition-animation;\n p {\n margin: 0;\n }\n }\n .table-container table,\n > table {\n width: 100%;\n border: 1px solid #ddd;\n margin: 1rem 0;\n border-collapse: collapse;\n box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.125);\n tr,\n td {\n height: 2rem;\n }\n thead {\n tr {\n background: #f8f8f8;\n }\n }\n tbody {\n tr:hover {\n background: #efefef;\n }\n }\n td,\n th {\n border: 1px solid #dedede;\n padding: 0.2rem 1rem 0 1rem;\n }\n }\n a {\n color: $feature-color;\n padding: 0 2px 0 2px;\n word-break: break-all;\n &:hover {\n border-bottom: 1px solid $feature-color;\n }\n &.fancybox {\n border: 0;\n }\n }\n}\n\n// ========== license ========== //\n.license-wrapper {\n background-color: $foreground-color;\n border-radius: 0 0 0.5rem 0.5rem;\n padding: 0.5rem 1.5rem;\n font-weight: 300;\n line-height: 1.5rem;\n border-top: 1px dashed #ccc;\n border-bottom: 1px dashed #ccc;\n color: $post-content-color;\n transition: $transition-animation;\n p {\n margin: 0.2rem 0;\n }\n a {\n color: $feature-color;\n word-break: break-all;\n }\n :first-child {\n margin-top: 1rem;\n }\n :last-child {\n margin-bottom: 1rem;\n }\n}\n\n// ========== toc ========== //\n.toc-wrapper {\n display: block;\n position: absolute;\n width: 22%;\n right: 1%;\n opacity: 1;\n max-width: calc((100% - 42.8125rem - 4rem) / 2);\n z-index: 9998;\n margin-top: calc(#{$header-height} + 1rem);\n transform: translate3d(0, 0, 0);\n transition: transform 0.4s ease-out, opacity 0.4s ease-out;\n .toc-active {\n color: $feature-color;\n }\n &-loding {\n opacity: 0;\n }\n}\n\n.toc-catalog {\n color: #bbb;\n padding: 0.5rem 0rem;\n z-index: 2;\n cursor: pointer;\n user-select: none;\n font: bolder 1.2rem $feature-font-family;\n &:hover {\n color: $feature-color;\n }\n}\n\n.catalog-icon {\n position: relative;\n top: -0.1rem;\n margin-right: 0.3rem;\n}\n\n.toc {\n max-height: calc(100vh - #{$header-height} - #{$footer-fixed-height} - 5rem);\n overflow: auto;\n &::-webkit-scrollbar {\n display: none;\n }\n}\n\n.toc,\n.toc-child {\n padding-left: 0;\n margin: 0 0 0 0;\n padding-top: 2px;\n z-index: 1;\n}\n\n.toc-wrapper {\n & > * {\n transform: translate(0, 0);\n transition: transform 0.3s ease-out, opacity 0.3s ease-out,\n color 0.5s ease-out;\n opacity: 1;\n }\n ol {\n padding-left: 1rem;\n }\n .toc-number {\n font-weight: bold;\n }\n a {\n color: #ccc;\n }\n a:hover {\n color: $feature-color !important;\n }\n}\n\n.toc-hide-children {\n & > * {\n transform: translate(20%, 0);\n opacity: 0;\n }\n .toc-catalog {\n display: block;\n transform: none;\n opacity: 1;\n }\n}\n\n.toc-fixed {\n position: fixed;\n top: 0rem !important;\n}\n\n.toc-slide {\n transform: translate3d($sidebar-width, 0, 0);\n}\n\n.toc-hide {\n display: none;\n}\n\n.toc-item {\n margin-bottom: 2px;\n}\n\n// ========== comment ========== //\n.post-comment {\n margin: 1rem 0;\n}\n",".four-zero-four-body {\n .loading {\n display: none !important;\n }\n\n .site-intro {\n height: 100%;\n }\n\n .site-intro-meta {\n height: 80%;\n }\n\n .intro-title {\n width: 80%;\n text-align: center;\n }\n\n .intro-subtitle {\n width: 90%;\n text-align: center;\n }\n\n .wrapper {\n height: 100vh;\n padding-bottom: 0;\n }\n\n .container {\n padding: 0;\n }\n\n .footer {\n width: 100%;\n z-index: 30;\n background-color: transparent;\n position: absolute;\n bottom: 0;\n // left: 0;\n }\n\n .iconfont-archer::before {\n color: rgba(255, 255, 255, 0.5);\n }\n\n .copyright {\n color: #ddd;\n }\n\n .website-approve a {\n color: #ddd;\n }\n\n #busuanzi_container_site_pv,\n #busuanzi_container_site_uv {\n color: #ddd;\n }\n}\n","$gt-color-main: $feature-color;\n$gt-color-main-lighter: lighten($gt-color-main, 20%);\n$gt-color-btn: #ffffff;\n\n#gitalk-container {\n a {\n color: $gt-color-main !important;\n &:hover {\n color: $gt-color-main-lighter !important;\n border-color: $gt-color-main-lighter !important;\n }\n }\n\n .gt-svg svg {\n fill: $gt-color-main !important;\n }\n\n .gt-spinner::before {\n border-color: $gt-color-btn !important;\n border-top-color: $gt-color-main !important;\n }\n\n .gt-btn {\n background-color: $gt-color-main !important;\n border-color: $gt-color-main !important;\n color: $gt-color-btn !important;\n &-login {\n &:hover {\n background-color: $gt-color-main-lighter !important;\n border-color: $gt-color-main-lighter !important;\n }\n }\n &-preview {\n background-color: $gt-color-btn !important;\n color: $gt-color-main !important;\n &:hover {\n background-color: darken($gt-color-btn, 5%) !important;\n border-color: $gt-color-main-lighter !important;\n }\n }\n &-public {\n &:hover {\n background-color: $gt-color-main-lighter !important;\n border-color: $gt-color-main-lighter !important;\n }\n }\n }\n\n .gt-link {\n border-bottom-color: $gt-color-main !important;\n }\n\n .gt-user .is--poping .gt-ico svg {\n fill: $gt-color-main !important;\n }\n\n .gt-popup .gt-action.is--active:before {\n background: $gt-color-main !important;\n }\n\n .gt-header-controls-tip {\n color: $gt-color-main !important;\n }\n\n .gt-comment-username {\n color: $gt-color-main !important;\n }\n}\n"]} \ No newline at end of file diff --git a/font/Oswald-Regular.ttf b/font/Oswald-Regular.ttf new file mode 100644 index 000000000..c749cfac9 Binary files /dev/null and b/font/Oswald-Regular.ttf differ diff --git a/font/Source Sans Pro.woff b/font/Source Sans Pro.woff new file mode 100644 index 000000000..5ac42007d Binary files /dev/null and b/font/Source Sans Pro.woff differ diff --git a/font/Source Sans Pro.woff2 b/font/Source Sans Pro.woff2 new file mode 100644 index 000000000..db0937ff4 Binary files /dev/null and b/font/Source Sans Pro.woff2 differ diff --git a/font/SourceCodePro-Regular.ttf.woff b/font/SourceCodePro-Regular.ttf.woff new file mode 100644 index 000000000..117c7e514 Binary files /dev/null and b/font/SourceCodePro-Regular.ttf.woff differ diff --git a/font/SourceCodePro-Regular.ttf.woff2 b/font/SourceCodePro-Regular.ttf.woff2 new file mode 100644 index 000000000..d97cd5493 Binary files /dev/null and b/font/SourceCodePro-Regular.ttf.woff2 differ diff --git a/img/avatar/answerywj.png b/img/avatar/answerywj.png new file mode 100644 index 000000000..50eb33ba8 Binary files /dev/null and b/img/avatar/answerywj.png differ diff --git a/img/pay/alipay.jpg b/img/pay/alipay.jpg new file mode 100644 index 000000000..ba91b3686 Binary files /dev/null and b/img/pay/alipay.jpg differ diff --git a/img/pay/wechatpay.jpg b/img/pay/wechatpay.jpg new file mode 100644 index 000000000..6161c0c99 Binary files /dev/null and b/img/pay/wechatpay.jpg differ diff --git a/img/site/404-bg-small.jpg b/img/site/404-bg-small.jpg new file mode 100644 index 000000000..477efb83f Binary files /dev/null and b/img/site/404-bg-small.jpg differ diff --git a/img/site/about-bg-small.jpg b/img/site/about-bg-small.jpg new file mode 100644 index 000000000..0f73c7112 Binary files /dev/null and b/img/site/about-bg-small.jpg differ diff --git a/img/site/index-bg-small.jpg b/img/site/index-bg-small.jpg new file mode 100644 index 000000000..9d8ef3945 Binary files /dev/null and b/img/site/index-bg-small.jpg differ diff --git a/img/site/post-bg-small.jpg b/img/site/post-bg-small.jpg new file mode 100644 index 000000000..56124123b Binary files /dev/null and b/img/site/post-bg-small.jpg differ diff --git a/img/site/tab_icon.png b/img/site/tab_icon.png new file mode 100644 index 000000000..4598069ca Binary files /dev/null and b/img/site/tab_icon.png differ diff --git a/img/social/wechat_public_qcode.png b/img/social/wechat_public_qcode.png new file mode 100644 index 000000000..cd6f13f78 Binary files /dev/null and b/img/social/wechat_public_qcode.png differ diff --git a/index.html b/index.html new file mode 100644 index 000000000..850dc7a41 --- /dev/null +++ b/index.html @@ -0,0 +1,2492 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + + + + +
+
+ + + + + + +
+
+
+ +

+ + + AnSwErYWJ's Blog + + +

+ +

+ + + + 广告位招租 + + + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + + inline使用注意事项 + +
+

GCC在不优化时不会内联任何函数,除非指定函数的“always_inline”属性。

+
+ + + +
+
+ + + + + + + + +
+ + + getrusage-进程资源统计函数 + +
+

getrusage用于统计系统资源使用情况,即进程执行直到调用该函数时的资源使用情况,如果在不同的时间调用该函数,会得到不同的结果。

+
+ + + +
+
+ + + + + + + + +
+ + + RPATH与RUNPATH的区别 + +
+

本文从一个实际遇到的问题出发,分析 RPATHRUNPATH 的区别,以及产生的原因。

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + + Homebrew + +
+

本文将介绍Homebrew的安装与使用。

+
+ + + +
+
+ + + + + + + + + +
+ + + + + +
+ + + +
+ avatar +
AnSwErYWJ
+ +
+ 快乐编程,健康生活 +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + FRIENDS +
+ + + + 谢小飞的博客 + + + +
+ + + + + + +
+ + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/intro/404-bg.jpg b/intro/404-bg.jpg new file mode 100644 index 000000000..bbe49db1e Binary files /dev/null and b/intro/404-bg.jpg differ diff --git a/intro/about-bg.jpg b/intro/about-bg.jpg new file mode 100644 index 000000000..54835c8f0 Binary files /dev/null and b/intro/about-bg.jpg differ diff --git a/intro/index-bg.jpg b/intro/index-bg.jpg new file mode 100644 index 000000000..61a067f34 Binary files /dev/null and b/intro/index-bg.jpg differ diff --git a/intro/post-bg.jpg b/intro/post-bg.jpg new file mode 100644 index 000000000..357bf2ffc Binary files /dev/null and b/intro/post-bg.jpg differ diff --git a/lib/jquery.min.js b/lib/jquery.min.js new file mode 100644 index 000000000..200b54e47 --- /dev/null +++ b/lib/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0=b.f?e():a.fonts.load(fa(b.a),b.h).then(function(a){1<=a.length?d():setTimeout(f,25)},function(){e()})}f()}),e=null,f=new Promise(function(a,d){e=setTimeout(d,b.f)});Promise.race([f,d]).then(function(){e&&(clearTimeout(e),e=null);b.g(b.a)},function(){b.j(b.a)})};function Q(a,b,c,d,e,f,g){this.v=a;this.B=b;this.c=c;this.a=d;this.s=g||"BESbswy";this.f={};this.w=e||3E3;this.u=f||null;this.m=this.j=this.h=this.g=null;this.g=new M(this.c,this.s);this.h=new M(this.c,this.s);this.j=new M(this.c,this.s);this.m=new M(this.c,this.s);a=new G(this.a.c+",serif",J(this.a));a=O(a);this.g.a.style.cssText=a;a=new G(this.a.c+",sans-serif",J(this.a));a=O(a);this.h.a.style.cssText=a;a=new G("serif",J(this.a));a=O(a);this.j.a.style.cssText=a;a=new G("sans-serif",J(this.a));a= +O(a);this.m.a.style.cssText=a;N(this.g);N(this.h);N(this.j);N(this.m)}var R={D:"serif",C:"sans-serif"},S=null;function T(){if(null===S){var a=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent);S=!!a&&(536>parseInt(a[1],10)||536===parseInt(a[1],10)&&11>=parseInt(a[2],10))}return S}Q.prototype.start=function(){this.f.serif=this.j.a.offsetWidth;this.f["sans-serif"]=this.m.a.offsetWidth;this.A=q();U(this)}; +function la(a,b,c){for(var d in R)if(R.hasOwnProperty(d)&&b===a.f[R[d]]&&c===a.f[R[d]])return!0;return!1}function U(a){var b=a.g.a.offsetWidth,c=a.h.a.offsetWidth,d;(d=b===a.f.serif&&c===a.f["sans-serif"])||(d=T()&&la(a,b,c));d?q()-a.A>=a.w?T()&&la(a,b,c)&&(null===a.u||a.u.hasOwnProperty(a.a.c))?V(a,a.v):V(a,a.B):ma(a):V(a,a.v)}function ma(a){setTimeout(p(function(){U(this)},a),50)}function V(a,b){setTimeout(p(function(){v(this.g.a);v(this.h.a);v(this.j.a);v(this.m.a);b(this.a)},a),0)};function W(a,b,c){this.c=a;this.a=b;this.f=0;this.m=this.j=!1;this.s=c}var X=null;W.prototype.g=function(a){var b=this.a;b.g&&w(b.f,[b.a.c("wf",a.c,J(a).toString(),"active")],[b.a.c("wf",a.c,J(a).toString(),"loading"),b.a.c("wf",a.c,J(a).toString(),"inactive")]);K(b,"fontactive",a);this.m=!0;na(this)}; +W.prototype.h=function(a){var b=this.a;if(b.g){var c=y(b.f,b.a.c("wf",a.c,J(a).toString(),"active")),d=[],e=[b.a.c("wf",a.c,J(a).toString(),"loading")];c||d.push(b.a.c("wf",a.c,J(a).toString(),"inactive"));w(b.f,d,e)}K(b,"fontinactive",a);na(this)};function na(a){0==--a.f&&a.j&&(a.m?(a=a.a,a.g&&w(a.f,[a.a.c("wf","active")],[a.a.c("wf","loading"),a.a.c("wf","inactive")]),K(a,"active")):L(a.a))};function oa(a){this.j=a;this.a=new ja;this.h=0;this.f=this.g=!0}oa.prototype.load=function(a){this.c=new ca(this.j,a.context||this.j);this.g=!1!==a.events;this.f=!1!==a.classes;pa(this,new ha(this.c,a),a)}; +function qa(a,b,c,d,e){var f=0==--a.h;(a.f||a.g)&&setTimeout(function(){var a=e||null,m=d||null||{};if(0===c.length&&f)L(b.a);else{b.f+=c.length;f&&(b.j=f);var h,l=[];for(h=0;h + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + +
+ + +
+ + +
+
+ + + + + + +
+
+
+ +

+ + + AnSwErYWJ's Blog + + +

+ +

+ + + + 广告位招租 + + + +

+ + +
+
+ + + + +
+
+ + + + + + + + + +
+ + + + + + + + +
+ + + 深究strtok系列函数 + +
+

本文通过分析源码,深究GLIBCstrtokstrtok_r函数的实现原理和使用过程中的注意事项。

+
+ + + +
+
+ + + + + + + + +
+ + + sysroot为何物? + +
+

本文介绍链接过程中sysroot的作用。

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + + C代码覆盖率测试工具Gcov + +
+

代码覆盖率测试反映了测试的广度与深度,量化了测试和开发质量,是十分有必要的,业界目前有针对各种语言的覆盖率测试工具,本文主要介绍C/C++相关的覆盖率测试工具Gcov

+
+ + + +
+
+ + + + + + + + +
+ + + cJSON的秘密 + +
+

学习使用cJSON过程的一些发现和总结,不涉及具体的函数

+
+ + + +
+
+ + + + + + + + +
+ + + Linux下core文件使用 + +
+

有时候程序会异常退出而不带任何日志,此时就可以使用core文件进行分析,它会记录程序运行的内存,寄存器,堆栈指针等信息

+
+ + + +
+
+ + + + + + + + +
+ + + Speex介绍 + +
+

本文将对Speex相关的概念进行介绍

+
+ + + +
+
+ + + + + + + + + +
+ + + + + +
+ + + +
+ avatar +
AnSwErYWJ
+ +
+ 快乐编程,健康生活 +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + FRIENDS +
+ + + + 谢小飞的博客 + + + +
+ + + + + + +
+ + +
+
+ + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/page/3/index.html b/page/3/index.html new file mode 100644 index 000000000..9398c0db1 --- /dev/null +++ b/page/3/index.html @@ -0,0 +1,2472 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + +
+ + +
+ + +
+
+ + + + + + +
+
+
+ +

+ + + AnSwErYWJ's Blog + + +

+ +

+ + + + 广告位招租 + + + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + GCC编译ARM篇 + +
+

ARM 平台下GCC编译相关介绍,待补充

+
+ + + +
+
+ + + + + + + + +
+ + + UNIX下IO模型分析 + +
+

UNIX下的五种常见IO模型分析,帮助理解

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + + 从文件流中读写整数--C语言 + +
+

本文将介绍在文本流中,读写整数的两个接口– int getw(FILE *fp)int putw(int w, FILE *fp),并且与你分享改进后的更实用的接口– unsigned int get_uint(FILE *fp)unsigned int put_uint(unsigned int i,FILE *fp).

+
+ + + +
+
+ + + + + + + + +
+ + + Linux下处理json数据 + +
+

当我们在Linux下需要处理json数据时,第一反应是用脚本编写一个工具,这样即耗时又不通用. 本文将介绍专门的命令行json处理工具jq.

+
+ + + +
+
+ + + + + + + + + +
+ + + + + +
+ + + +
+ avatar +
AnSwErYWJ
+ +
+ 快乐编程,健康生活 +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + FRIENDS +
+ + + + 谢小飞的博客 + + + +
+ + + + + + +
+ + +
+
+ + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/page/4/index.html b/page/4/index.html new file mode 100644 index 000000000..355b2a622 --- /dev/null +++ b/page/4/index.html @@ -0,0 +1,2480 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + +
+ + +
+ + +
+
+ + + + + + +
+
+
+ +

+ + + AnSwErYWJ's Blog + + +

+ +

+ + + + 广告位招租 + + + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + 科普|3.5mm耳机国标和美标 + +
+

现在3.5mm规格的耳机已经普遍使用,但是用户会发现一些国外厂家的耳机并不适用国产手机,下面就为大家科普一下,解开这个迷题。

+
+ + + +
+
+ + + + + + + + +
+ + + Shell脚本浮点运算 + +
+

本文将介绍几种Linux下通过Shell脚本进行浮点数计算的方法。

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + +
+ + + Hexo+Github博客备份方法 + +
+

使用hexo+github搭建的博客,博客作为一个单独的github仓库存在,可是仓库中不包含你每篇博客的源文件。如果你换了一台机器想要更新博客或者想重新发布以前的博客,这就不好办了。我这里推荐一种云端备份的方法。

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + + UNIX编程安全读写函数 + +
+

字节流套接字(TCP套接字)上的read和write函数所表现的行为不同于通常的文件I/O。字节流套接字调用read或write输入或输出的字节数可能比请求的数量少,然而这并不是出错的状态。这是因为内核中用于套接字的缓冲区可能达到了极限。通常这种情况出现在一次读多于4096个字节或write在非阻塞情况下返回不足字节数。为了不多次调用read或防止write返回不足字节数,我们用下面的两个函数来替代read和write。

+
+ + + +
+
+ + + + + + + + +
+ + + C语言生成随机数 + +
+

本文将介绍C语言生成随机数的方法,主要使用 rand() 函数和 srand() 函数.

+
+ + + +
+
+ + + + + +
+ + + +
+ avatar +
AnSwErYWJ
+ +
+ 快乐编程,健康生活 +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + FRIENDS +
+ + + + 谢小飞的博客 + + + +
+ + + + + + +
+ + +
+
+ + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/page/5/index.html b/page/5/index.html new file mode 100644 index 000000000..7766e06f6 --- /dev/null +++ b/page/5/index.html @@ -0,0 +1,2184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + AnSwErYWJ's Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+ +
+ + + + + + + AnSwErYWJ's Blog + +
+ + +
+ + +
+ + +
+ + +
+
+ + + + + + +
+
+
+ +

+ + + AnSwErYWJ's Blog + + +

+ +

+ + + + 广告位招租 + + + +

+ + +
+
+ + + + +
+
+ + + + + + + + +
+ + + Linux Shell 脚本调试总结 + +
+

Shell脚本是用户与Linux操作系统交互的一种方式,在脚本编程过程中自然少不了进行调试工作,本文将介绍三种常用的调试方法.(默认使用bash shell)

+
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + + Linux fork炸弹解析 + +
+

**:(){ :|: & };:**是一个bash函数,以Fork Bomb闻名,是一个拒绝服务攻击 的Linux 系统。如果你好奇地去执行了这个命令,那么赶快重启系统吧~!

+
+ + + +
+
+ + + + + +
+ + + +
+ avatar +
AnSwErYWJ
+ +
+ 快乐编程,健康生活 +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + FRIENDS +
+ + + + 谢小飞的博客 + + + +
+ + + + + + +
+ + +
+
+ + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/placeholder b/placeholder deleted file mode 100644 index e69de29bb..000000000 diff --git a/scripts/customFontLoader.js b/scripts/customFontLoader.js new file mode 100644 index 000000000..9771b9918 --- /dev/null +++ b/scripts/customFontLoader.js @@ -0,0 +1,2 @@ +(()=>{var t,n,i,e={5933:(t,n,i)=>{var e;!function(){function o(t,n,i){return t.call.apply(t.bind,arguments)}function a(t,n,i){if(!t)throw Error();if(2=n.f?o():t.fonts.load(function(t){return T(t)+" "+t.f+"00 300px "+_(t.c)}(n.a),n.h).then((function(t){1<=t.length?e():setTimeout(a,25)}),(function(){o()}))}()})),o=null,a=new Promise((function(t,i){o=setTimeout(i,n.f)}));Promise.race([a,e]).then((function(){o&&(clearTimeout(o),o=null),n.g(n.a)}),(function(){n.j(n.a)}))};var W={D:"serif",C:"sans-serif"},B=null;function D(){if(null===B){var t=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent);B=!!t&&(536>parseInt(t[1],10)||536===parseInt(t[1],10)&&11>=parseInt(t[2],10))}return B}function $(t,n,i){for(var e in W)if(W.hasOwnProperty(e)&&n===t.f[W[e]]&&i===t.f[W[e]])return!0;return!1}function M(t){var n,i=t.g.a.offsetWidth,e=t.h.a.offsetWidth;(n=i===t.f.serif&&e===t.f["sans-serif"])||(n=D()&&$(t,i,e)),n?r()-t.A>=t.w?D()&&$(t,i,e)&&(null===t.u||t.u.hasOwnProperty(t.a.c))?q(t,t.v):q(t,t.B):function(t){setTimeout(s((function(){M(this)}),t),50)}(t):q(t,t.v)}function q(t,n){setTimeout(s((function(){u(this.g.a),u(this.h.a),u(this.j.a),u(this.m.a),n(this.a)}),t),0)}function H(t,n,i){this.c=t,this.a=n,this.f=0,this.m=this.j=!1,this.s=i}L.prototype.start=function(){this.f.serif=this.j.a.offsetWidth,this.f["sans-serif"]=this.m.a.offsetWidth,this.A=r(),M(this)};var U=null;function V(t){0==--t.f&&t.j&&(t.m?((t=t.a).g&&p(t.f,[t.a.c("wf","active")],[t.a.c("wf","loading"),t.a.c("wf","inactive")]),E(t,"active")):A(t.a))}function z(t){this.j=t,this.a=new N,this.h=0,this.f=this.g=!0}function G(t,n,i,e,o){var a=0==--t.h;(t.f||t.g)&&setTimeout((function(){var t=o||null,r=e||{};if(0===i.length&&a)A(n.a);else{n.f+=i.length,a&&(n.j=a);var c,f=[];for(c=0;c {\n WebFont.load({\n custom: {\n families: [fontName],\n urls: [fontUrl],\n },\n loading: () => {\n console.log(`Loading custom font: ${fontUrl}`)\n },\n active: () => {\n console.log('Custom font active!')\n },\n inactive: () => {\n console.error(\n 'Custom font inactive. Please check network, font name and load urls.'\n )\n },\n })\n\n const root = document.documentElement\n const customBaseFontFamily =\n fontName.split(':')[0] +\n ', ' +\n getComputedStyle(root).getPropertyValue('--base-font-family')\n root.style.setProperty('--base-font-family', customBaseFontFamily)\n })\n}\n","/* Web Font Loader v1.6.28 - (c) Adobe Systems, Google. License: Apache 2.0 */(function(){function aa(a,b,c){return a.call.apply(a.bind,arguments)}function ba(a,b,c){if(!a)throw Error();if(2=b.f?e():a.fonts.load(fa(b.a),b.h).then(function(a){1<=a.length?d():setTimeout(f,25)},function(){e()})}f()}),e=null,f=new Promise(function(a,d){e=setTimeout(d,b.f)});Promise.race([f,d]).then(function(){e&&(clearTimeout(e),e=null);b.g(b.a)},function(){b.j(b.a)})};function Q(a,b,c,d,e,f,g){this.v=a;this.B=b;this.c=c;this.a=d;this.s=g||\"BESbswy\";this.f={};this.w=e||3E3;this.u=f||null;this.m=this.j=this.h=this.g=null;this.g=new M(this.c,this.s);this.h=new M(this.c,this.s);this.j=new M(this.c,this.s);this.m=new M(this.c,this.s);a=new G(this.a.c+\",serif\",J(this.a));a=O(a);this.g.a.style.cssText=a;a=new G(this.a.c+\",sans-serif\",J(this.a));a=O(a);this.h.a.style.cssText=a;a=new G(\"serif\",J(this.a));a=O(a);this.j.a.style.cssText=a;a=new G(\"sans-serif\",J(this.a));a=\nO(a);this.m.a.style.cssText=a;N(this.g);N(this.h);N(this.j);N(this.m)}var R={D:\"serif\",C:\"sans-serif\"},S=null;function T(){if(null===S){var a=/AppleWebKit\\/([0-9]+)(?:\\.([0-9]+))/.exec(window.navigator.userAgent);S=!!a&&(536>parseInt(a[1],10)||536===parseInt(a[1],10)&&11>=parseInt(a[2],10))}return S}Q.prototype.start=function(){this.f.serif=this.j.a.offsetWidth;this.f[\"sans-serif\"]=this.m.a.offsetWidth;this.A=q();U(this)};\nfunction la(a,b,c){for(var d in R)if(R.hasOwnProperty(d)&&b===a.f[R[d]]&&c===a.f[R[d]])return!0;return!1}function U(a){var b=a.g.a.offsetWidth,c=a.h.a.offsetWidth,d;(d=b===a.f.serif&&c===a.f[\"sans-serif\"])||(d=T()&&la(a,b,c));d?q()-a.A>=a.w?T()&&la(a,b,c)&&(null===a.u||a.u.hasOwnProperty(a.a.c))?V(a,a.v):V(a,a.B):ma(a):V(a,a.v)}function ma(a){setTimeout(p(function(){U(this)},a),50)}function V(a,b){setTimeout(p(function(){v(this.g.a);v(this.h.a);v(this.j.a);v(this.m.a);b(this.a)},a),0)};function W(a,b,c){this.c=a;this.a=b;this.f=0;this.m=this.j=!1;this.s=c}var X=null;W.prototype.g=function(a){var b=this.a;b.g&&w(b.f,[b.a.c(\"wf\",a.c,J(a).toString(),\"active\")],[b.a.c(\"wf\",a.c,J(a).toString(),\"loading\"),b.a.c(\"wf\",a.c,J(a).toString(),\"inactive\")]);K(b,\"fontactive\",a);this.m=!0;na(this)};\nW.prototype.h=function(a){var b=this.a;if(b.g){var c=y(b.f,b.a.c(\"wf\",a.c,J(a).toString(),\"active\")),d=[],e=[b.a.c(\"wf\",a.c,J(a).toString(),\"loading\")];c||d.push(b.a.c(\"wf\",a.c,J(a).toString(),\"inactive\"));w(b.f,d,e)}K(b,\"fontinactive\",a);na(this)};function na(a){0==--a.f&&a.j&&(a.m?(a=a.a,a.g&&w(a.f,[a.a.c(\"wf\",\"active\")],[a.a.c(\"wf\",\"loading\"),a.a.c(\"wf\",\"inactive\")]),K(a,\"active\")):L(a.a))};function oa(a){this.j=a;this.a=new ja;this.h=0;this.f=this.g=!0}oa.prototype.load=function(a){this.c=new ca(this.j,a.context||this.j);this.g=!1!==a.events;this.f=!1!==a.classes;pa(this,new ha(this.c,a),a)};\nfunction qa(a,b,c,d,e){var f=0==--a.h;(a.f||a.g)&&setTimeout(function(){var a=e||null,m=d||null||{};if(0===c.length&&f)L(b.a);else{b.f+=c.length;f&&(b.j=f);var h,l=[];for(h=0;h{var e,r=$(".header-theme-btn"),a=function(e){e?r.removeClass("header-theme-btn-disabled"):r.addClass("header-theme-btn-disabled")},t=function(e){a(!1);var r=$("LINK[href='".concat(e,"css/dark.css']"));1===r.length?(r.remove(),localStorage.preferredThemeMode="light"):($("").attr({rel:"stylesheet",type:"text/css",href:"".concat(e,"css/dark.css")}).appendTo("head"),localStorage.preferredThemeMode="dark"),a(!0)};a(!1),"light"===((e=localStorage.preferredThemeMode)?e="dark"===e?"dark":"light":(e=window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light",localStorage.preferredThemeMode=e),e)&&t(window.siteMeta.root),r.click((function(){t(window.siteMeta.root)})),a(!0)})(); +//# sourceMappingURL=dark.js.map \ No newline at end of file diff --git a/scripts/dark.js.map b/scripts/dark.js.map new file mode 100644 index 000000000..1711dfaa7 --- /dev/null +++ b/scripts/dark.js.map @@ -0,0 +1 @@ +{"version":3,"file":"dark.js","mappings":"MAAA,IAIMA,EAJAC,EAAsBC,EAAE,qBAmBxBC,EAA8B,SAACC,GAC/BA,EACFH,EAAoBI,YAAY,6BAEhCJ,EAAoBK,SAAS,4BAEjC,EAGMC,EAAkB,SAAUC,GAChCL,GAA4B,GAC5B,IAAMM,EAAsBP,EAAE,cAAD,OAAeM,EAAI,mBACb,IAA/BC,EAAoBC,QACtBD,EAAoBE,SACpBC,aAAaZ,mBAAqB,UAElCE,EAAE,UACCW,KAAK,CACJC,IAAK,aACLC,KAAM,WACNC,KAAM,GAAF,OAAKR,EAAI,kBAEdS,SAAS,QACZL,aAAaZ,mBAAqB,QAEpCG,GAA4B,EAC9B,EAIEA,GAA4B,GAII,YAjD5BH,EAAqBY,aAAaZ,oBASpCA,EAA4C,SAAvBA,EAAgC,OAAS,SAN9DA,EAAqBkB,OAAOC,WAAW,gCACpCC,QACC,OACA,QACJR,aAAaZ,mBAAqBA,GAI7BA,IAuCLO,EAAgBW,OAAOG,SAASb,MAGlCP,EAAoBqB,OAAM,WACxBf,EAAgBW,OAAOG,SAASb,KAClC,IAEAL,GAA4B,E","sources":["webpack://hexo-theme-archer/./src/js/dark.js"],"sourcesContent":["const $themeModeSwitchBtn = $('.header-theme-btn')\n\n// 获取用户偏好的主题颜色模式\nconst getPreferredThemeMode = function () {\n let preferredThemeMode = localStorage.preferredThemeMode\n if (!preferredThemeMode) {\n // 首次访问时,设置用户偏好主题颜色模式为系统偏好主题颜色模式\n preferredThemeMode = window.matchMedia('(prefers-color-scheme: dark)')\n .matches\n ? 'dark'\n : 'light'\n localStorage.preferredThemeMode = preferredThemeMode\n } else {\n preferredThemeMode = preferredThemeMode === 'dark' ? 'dark' : 'light'\n }\n return preferredThemeMode\n}\n\n// 设置切换主题按钮可点击\nconst setThemeModeSwitchBtnActive = (active) => {\n if (active) {\n $themeModeSwitchBtn.removeClass('header-theme-btn-disabled')\n } else {\n $themeModeSwitchBtn.addClass('header-theme-btn-disabled')\n }\n}\n\n// 切换主题颜色模式\nconst switchThemeMode = function (root) {\n setThemeModeSwitchBtnActive(false)\n const $darkModeSourceLink = $(`LINK[href='${root}css/dark.css']`)\n if ($darkModeSourceLink.length === 1) {\n $darkModeSourceLink.remove()\n localStorage.preferredThemeMode = 'light'\n } else {\n $('')\n .attr({\n rel: 'stylesheet',\n type: 'text/css',\n href: `${root}css/dark.css`,\n })\n .appendTo('head')\n localStorage.preferredThemeMode = 'dark'\n }\n setThemeModeSwitchBtnActive(true)\n}\n\n// 初始化切换主题颜色模式功能\nconst initThemeModeSwitchButton = function () {\n setThemeModeSwitchBtnActive(false)\n\n // 默认情况下,加载暗色主题\n // 若用户偏好浅色主题,则切换主题颜色模式\n if (getPreferredThemeMode() === 'light') {\n switchThemeMode(window.siteMeta.root)\n }\n\n $themeModeSwitchBtn.click(function () {\n switchThemeMode(window.siteMeta.root)\n })\n\n setThemeModeSwitchBtnActive(true)\n}\n\ninitThemeModeSwitchButton()\n"],"names":["preferredThemeMode","$themeModeSwitchBtn","$","setThemeModeSwitchBtnActive","active","removeClass","addClass","switchThemeMode","root","$darkModeSourceLink","length","remove","localStorage","attr","rel","type","href","appendTo","window","matchMedia","matches","siteMeta","click"],"sourceRoot":""} \ No newline at end of file diff --git a/scripts/main.js b/scripts/main.js new file mode 100644 index 000000000..c80ee581c --- /dev/null +++ b/scripts/main.js @@ -0,0 +1,3 @@ +/*! For license information please see main.js.LICENSE.txt */ +(()=>{var c={2382:()=>{!function(){"use strict";var c={},l={};try{"undefined"!=typeof window&&(c=window),"undefined"!=typeof document&&(l=document)}catch(c){}var a=(c.navigator||{}).userAgent,e=void 0===a?"":a,t=c,h=l,r=(t.document,!!h.documentElement&&!!h.head&&"function"==typeof h.addEventListener&&h.createElement,~e.indexOf("MSIE")||e.indexOf("Trident/"),"___FONT_AWESOME___"),v=function(){try{return!0}catch(c){return!1}}(),s=t||{};s[r]||(s[r]={}),s[r].styles||(s[r].styles={}),s[r].hooks||(s[r].hooks={}),s[r].shims||(s[r].shims=[]);var n=s[r];function z(c,l){var a=(2{!function(){"use strict";function c(l){return(c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(c){return typeof c}:function(c){return c&&"function"==typeof Symbol&&c.constructor===Symbol&&c!==Symbol.prototype?"symbol":typeof c})(l)}function l(c){for(var l=1;l>>0;a--;)l[a]=c[a];return l}function Hc(c){return c.classList?uc(c.classList):(c.getAttribute("class")||"").split(" ").filter((function(c){return c}))}function Vc(c){return"".concat(c).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}function dc(c){return Object.keys(c||{}).reduce((function(l,a){return l+"".concat(a,": ").concat(c[a],";")}),"")}function Cc(c){return c.size!==mc.size||c.x!==mc.x||c.y!==mc.y||c.rotate!==mc.rotate||c.flipX||c.flipY}function Lc(c){var l=c.transform,a=c.containerWidth,e=c.iconWidth,t={transform:"translate(".concat(a/2," 256)")},h="translate(".concat(32*l.x,", ").concat(32*l.y,") "),r="scale(".concat(l.size/16*(l.flipX?-1:1),", ").concat(l.size/16*(l.flipY?-1:1),") "),v="rotate(".concat(l.rotate," 0 0)");return{outer:t,inner:{transform:"".concat(h," ").concat(r," ").concat(v)},path:{transform:"translate(".concat(e/2*-1," -256)")}}}var pc={x:0,y:0,width:"100%",height:"100%"};function Ac(c){var l=!(1").concat(r.map(Yc).join(""),"")}var Dc=function(){};function Xc(c){return"string"==typeof(c.getAttribute?c.getAttribute(L):null)}var Wc={replace:function(c){var l=c[0],a=c[1].map((function(c){return Yc(c)})).join("\n");if(l.parentNode&&l.outerHTML)l.outerHTML=a+(I.keepOriginalSource&&"svg"!==l.tagName.toLowerCase()?"\x3c!-- ".concat(l.outerHTML," Font Awesome fontawesome.com --\x3e"):"");else if(l.parentNode){var e=document.createElement("span");l.parentNode.replaceChild(e,l),e.outerHTML=a}},nest:function(c){var l=c[0],a=c[1];if(~Hc(l).indexOf(I.replacementClass))return Wc.replace(c);var e=new RegExp("".concat(I.familyPrefix,"-.*"));delete a[0].attributes.style,delete a[0].attributes.id;var t=a[0].attributes.class.split(" ").reduce((function(c,l){return l===I.replacementClass||l.match(e)?c.toSvg.push(l):c.toNode.push(l),c}),{toNode:[],toSvg:[]});a[0].attributes.class=t.toSvg.join(" ");var h=a.map((function(c){return Yc(c)})).join("\n");l.setAttribute("class",t.toNode.join(" ")),l.setAttribute(L,""),l.innerHTML=h}};function $c(c){c()}function Bc(c,l){var a="function"==typeof l?l:Dc;if(0===c.length)a();else{var e=$c;"async"===I.mutateApproach&&(e=i.requestAnimationFrame||$c),e((function(){var l=!0===I.autoReplaceSvg?Wc.replace:Wc[I.autoReplaceSvg]||Wc.replace,e=xc("mutate");c.map(l),e(),a()}))}}var Fc=!1;function Gc(){Fc=!1}var Qc=null;function Uc(c){if(f&&I.observeMutations){var l=c.treeCallback,a=c.nodeCallback,e=c.pseudoElementsCallback,t=c.observeMutationsRoot,h=void 0===t?m:t;Qc=new f((function(c){Fc||uc(c).forEach((function(c){if("childList"===c.type&&0li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);transform:scale(1,-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1,-1);transform:scale(-1,-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;position:relative;width:2.5em}.fa-stack-1x,.fa-stack-2x{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.svg-inline--fa.fa-stack-1x{height:1em;width:1.25em}.svg-inline--fa.fa-stack-2x{height:2em;width:2.5em}.fa-inverse{color:#fff}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.svg-inline--fa .fa-primary{fill:var(--fa-primary-color,currentColor);opacity:1;opacity:var(--fa-primary-opacity,1)}.svg-inline--fa .fa-secondary{fill:var(--fa-secondary-color,currentColor);opacity:.4;opacity:var(--fa-secondary-opacity,.4)}.svg-inline--fa.fa-swap-opacity .fa-primary{opacity:.4;opacity:var(--fa-secondary-opacity,.4)}.svg-inline--fa.fa-swap-opacity .fa-secondary{opacity:1;opacity:var(--fa-primary-opacity,1)}.svg-inline--fa mask .fa-primary,.svg-inline--fa mask .fa-secondary{fill:#000}.fad.fa-inverse{color:#fff}";if(a!==c||e!==l){var h=new RegExp("\\.".concat(c,"\\-"),"g"),r=new RegExp("\\--".concat(c,"\\-"),"g"),v=new RegExp("\\.".concat(l),"g");t=t.replace(h,".".concat(a,"-")).replace(r,"--".concat(a,"-")).replace(v,".".concat(e))}return t}function Hl(){I.autoAddCss&&!pl&&(fc(ul()),pl=!0)}function Vl(c,l){return Object.defineProperty(c,"abstract",{get:l}),Object.defineProperty(c,"html",{get:function(){return c.abstract.map((function(c){return Yc(c)}))}}),Object.defineProperty(c,"node",{get:function(){if(H){var l=m.createElement("div");return l.innerHTML=c.html,l.children}}}),c}function dl(c){var l=c.prefix,a=void 0===l?"fa":l,e=c.iconName;if(e)return Nc(Ll.definitions,a,e)||Nc(q.styles,a,e)}var Cl,Ll=new(function(){function c(){!function(c,l){if(!(c instanceof l))throw new TypeError("Cannot call a class as a function")}(this,c),this.definitions={}}var a;return(a=[{key:"add",value:function(){for(var c=this,a=arguments.length,e=new Array(a),t=0;t{!function(){"use strict";var c={},l={};try{"undefined"!=typeof window&&(c=window),"undefined"!=typeof document&&(l=document)}catch(c){}var a=(c.navigator||{}).userAgent,e=void 0===a?"":a,t=c,h=l,r=(t.document,!!h.documentElement&&!!h.head&&"function"==typeof h.addEventListener&&h.createElement,~e.indexOf("MSIE")||e.indexOf("Trident/"),"___FONT_AWESOME___"),v=function(){try{return!0}catch(c){return!1}}(),s=t||{};s[r]||(s[r]={}),s[r].styles||(s[r].styles={}),s[r].hooks||(s[r].hooks={}),s[r].shims||(s[r].shims=[]);var n=s[r];function z(c,l){var a=(2.anchorjs-link,.anchorjs-link:focus{opacity:1}",l.sheet.cssRules.length),l.sheet.insertRule("[data-anchorjs-icon]::after{content:attr(data-anchorjs-icon)}",l.sheet.cssRules.length),l.sheet.insertRule('@font-face{font-family:anchorjs-icons;src:url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype")}',l.sheet.cssRules.length)}}(),t=document.querySelectorAll("[id]"),h=[].map.call(t,(function(c){return c.id})),v=0;v\]./()*\\\n\t\b\v\u00A0]/g,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(c){var l=c.firstChild&&(" "+c.firstChild.className+" ").indexOf(" anchorjs-link ")>-1,a=c.lastChild&&(" "+c.lastChild.className+" ").indexOf(" anchorjs-link ")>-1;return l||a||!1}}})?a.apply(l,e):a)||(c.exports=t)}()},9662:(c,l,a)=>{var e=a(614),t=a(6330),h=TypeError;c.exports=function(c){if(e(c))return c;throw h(t(c)+" is not a function")}},6077:(c,l,a)=>{var e=a(614),t=String,h=TypeError;c.exports=function(c){if("object"==typeof c||e(c))return c;throw h("Can't set "+t(c)+" as a prototype")}},1223:(c,l,a)=>{var e=a(5112),t=a(30),h=a(3070).f,r=e("unscopables"),v=Array.prototype;null==v[r]&&h(v,r,{configurable:!0,value:t(null)}),c.exports=function(c){v[r][c]=!0}},1530:(c,l,a)=>{"use strict";var e=a(8710).charAt;c.exports=function(c,l,a){return l+(a?e(c,l).length:1)}},5787:(c,l,a)=>{var e=a(7976),t=TypeError;c.exports=function(c,l){if(e(l,c))return c;throw t("Incorrect invocation")}},9670:(c,l,a)=>{var e=a(111),t=String,h=TypeError;c.exports=function(c){if(e(c))return c;throw h(t(c)+" is not an object")}},7556:(c,l,a)=>{var e=a(7293);c.exports=e((function(){if("function"==typeof ArrayBuffer){var c=new ArrayBuffer(8);Object.isExtensible(c)&&Object.defineProperty(c,"a",{value:8})}}))},8533:(c,l,a)=>{"use strict";var e=a(2092).forEach,t=a(9341)("forEach");c.exports=t?[].forEach:function(c){return e(this,c,arguments.length>1?arguments[1]:void 0)}},1318:(c,l,a)=>{var e=a(5656),t=a(1400),h=a(6244),r=function(c){return function(l,a,r){var v,s=e(l),n=h(s),z=t(r,n);if(c&&a!=a){for(;n>z;)if((v=s[z++])!=v)return!0}else for(;n>z;z++)if((c||z in s)&&s[z]===a)return c||z||0;return!c&&-1}};c.exports={includes:r(!0),indexOf:r(!1)}},2092:(c,l,a)=>{var e=a(9974),t=a(1702),h=a(8361),r=a(7908),v=a(6244),s=a(5417),n=t([].push),z=function(c){var l=1==c,a=2==c,t=3==c,z=4==c,o=6==c,i=7==c,m=5==c||o;return function(f,M,u,H){for(var V,d,C=r(f),L=h(C),p=e(M,u),A=v(L),b=0,g=H||s,y=l?g(f,A):a||i?g(f,0):void 0;A>b;b++)if((m||b in L)&&(d=p(V=L[b],b,C),c))if(l)y[b]=d;else if(d)switch(c){case 3:return!0;case 5:return V;case 6:return b;case 2:n(y,V)}else switch(c){case 4:return!1;case 7:n(y,V)}return o?-1:t||z?z:y}};c.exports={forEach:z(0),map:z(1),filter:z(2),some:z(3),every:z(4),find:z(5),findIndex:z(6),filterReject:z(7)}},1194:(c,l,a)=>{var e=a(7293),t=a(5112),h=a(7392),r=t("species");c.exports=function(c){return h>=51||!e((function(){var l=[];return(l.constructor={})[r]=function(){return{foo:1}},1!==l[c](Boolean).foo}))}},9341:(c,l,a)=>{"use strict";var e=a(7293);c.exports=function(c,l){var a=[][c];return!!a&&e((function(){a.call(null,l||function(){return 1},1)}))}},1589:(c,l,a)=>{var e=a(1400),t=a(6244),h=a(6135),r=Array,v=Math.max;c.exports=function(c,l,a){for(var s=t(c),n=e(l,s),z=e(void 0===a?s:a,s),o=r(v(z-n,0)),i=0;n{var e=a(3157),t=a(4411),h=a(111),r=a(5112)("species"),v=Array;c.exports=function(c){var l;return e(c)&&(l=c.constructor,(t(l)&&(l===v||e(l.prototype))||h(l)&&null===(l=l[r]))&&(l=void 0)),void 0===l?v:l}},5417:(c,l,a)=>{var e=a(7475);c.exports=function(c,l){return new(e(c))(0===l?0:l)}},7072:(c,l,a)=>{var e=a(5112)("iterator"),t=!1;try{var h=0,r={next:function(){return{done:!!h++}},return:function(){t=!0}};r[e]=function(){return this},Array.from(r,(function(){throw 2}))}catch(c){}c.exports=function(c,l){if(!l&&!t)return!1;var a=!1;try{var h={};h[e]=function(){return{next:function(){return{done:a=!0}}}},c(h)}catch(c){}return a}},4326:(c,l,a)=>{var e=a(1702),t=e({}.toString),h=e("".slice);c.exports=function(c){return h(t(c),8,-1)}},648:(c,l,a)=>{var e=a(1694),t=a(614),h=a(4326),r=a(5112)("toStringTag"),v=Object,s="Arguments"==h(function(){return arguments}());c.exports=e?h:function(c){var l,a,e;return void 0===c?"Undefined":null===c?"Null":"string"==typeof(a=function(c,l){try{return c[l]}catch(c){}}(l=v(c),r))?a:s?h(l):"Object"==(e=h(l))&&t(l.callee)?"Arguments":e}},5631:(c,l,a)=>{"use strict";var e=a(3070).f,t=a(30),h=a(9190),r=a(9974),v=a(5787),s=a(8554),n=a(408),z=a(1656),o=a(6178),i=a(6340),m=a(9781),f=a(2423).fastKey,M=a(9909),u=M.set,H=M.getterFor;c.exports={getConstructor:function(c,l,a,z){var o=c((function(c,e){v(c,i),u(c,{type:l,index:t(null),first:void 0,last:void 0,size:0}),m||(c.size=0),s(e)||n(e,c[z],{that:c,AS_ENTRIES:a})})),i=o.prototype,M=H(l),V=function(c,l,a){var e,t,h=M(c),r=d(c,l);return r?r.value=a:(h.last=r={index:t=f(l,!0),key:l,value:a,previous:e=h.last,next:void 0,removed:!1},h.first||(h.first=r),e&&(e.next=r),m?h.size++:c.size++,"F"!==t&&(h.index[t]=r)),c},d=function(c,l){var a,e=M(c),t=f(l);if("F"!==t)return e.index[t];for(a=e.first;a;a=a.next)if(a.key==l)return a};return h(i,{clear:function(){for(var c=M(this),l=c.index,a=c.first;a;)a.removed=!0,a.previous&&(a.previous=a.previous.next=void 0),delete l[a.index],a=a.next;c.first=c.last=void 0,m?c.size=0:this.size=0},delete:function(c){var l=this,a=M(l),e=d(l,c);if(e){var t=e.next,h=e.previous;delete a.index[e.index],e.removed=!0,h&&(h.next=t),t&&(t.previous=h),a.first==e&&(a.first=t),a.last==e&&(a.last=h),m?a.size--:l.size--}return!!e},forEach:function(c){for(var l,a=M(this),e=r(c,arguments.length>1?arguments[1]:void 0);l=l?l.next:a.first;)for(e(l.value,l.key,this);l&&l.removed;)l=l.previous},has:function(c){return!!d(this,c)}}),h(i,a?{get:function(c){var l=d(this,c);return l&&l.value},set:function(c,l){return V(this,0===c?0:c,l)}}:{add:function(c){return V(this,c=0===c?0:c,c)}}),m&&e(i,"size",{get:function(){return M(this).size}}),o},setStrong:function(c,l,a){var e=l+" Iterator",t=H(l),h=H(e);z(c,l,(function(c,l){u(this,{type:e,target:c,state:t(c),kind:l,last:void 0})}),(function(){for(var c=h(this),l=c.kind,a=c.last;a&&a.removed;)a=a.previous;return c.target&&(c.last=a=a?a.next:c.state.first)?o("keys"==l?a.key:"values"==l?a.value:[a.key,a.value],!1):(c.target=void 0,o(void 0,!0))}),a?"entries":"values",!a,!0),i(l)}}},7710:(c,l,a)=>{"use strict";var e=a(2109),t=a(7854),h=a(1702),r=a(4705),v=a(8052),s=a(2423),n=a(408),z=a(5787),o=a(614),i=a(8554),m=a(111),f=a(7293),M=a(7072),u=a(8003),H=a(9587);c.exports=function(c,l,a){var V=-1!==c.indexOf("Map"),d=-1!==c.indexOf("Weak"),C=V?"set":"add",L=t[c],p=L&&L.prototype,A=L,b={},g=function(c){var l=h(p[c]);v(p,c,"add"==c?function(c){return l(this,0===c?0:c),this}:"delete"==c?function(c){return!(d&&!m(c))&&l(this,0===c?0:c)}:"get"==c?function(c){return d&&!m(c)?void 0:l(this,0===c?0:c)}:"has"==c?function(c){return!(d&&!m(c))&&l(this,0===c?0:c)}:function(c,a){return l(this,0===c?0:c,a),this})};if(r(c,!o(L)||!(d||p.forEach&&!f((function(){(new L).entries().next()})))))A=a.getConstructor(l,c,V,C),s.enable();else if(r(c,!0)){var y=new A,w=y[C](d?{}:-0,1)!=y,S=f((function(){y.has(1)})),x=M((function(c){new L(c)})),k=!d&&f((function(){for(var c=new L,l=5;l--;)c[C](l,l);return!c.has(-0)}));x||((A=l((function(c,l){z(c,p);var a=H(new L,c,A);return i(l)||n(l,a[C],{that:a,AS_ENTRIES:V}),a}))).prototype=p,p.constructor=A),(S||k)&&(g("delete"),g("has"),V&&g("get")),(k||w)&&g(C),d&&p.clear&&delete p.clear}return b[c]=A,e({global:!0,constructor:!0,forced:A!=L},b),u(A,c),d||a.setStrong(A,c,V),A}},9920:(c,l,a)=>{var e=a(2597),t=a(3887),h=a(1236),r=a(3070);c.exports=function(c,l,a){for(var v=t(l),s=r.f,n=h.f,z=0;z{var e=a(7293);c.exports=!e((function(){function c(){}return c.prototype.constructor=null,Object.getPrototypeOf(new c)!==c.prototype}))},6178:c=>{c.exports=function(c,l){return{value:c,done:l}}},8880:(c,l,a)=>{var e=a(9781),t=a(3070),h=a(9114);c.exports=e?function(c,l,a){return t.f(c,l,h(1,a))}:function(c,l,a){return c[l]=a,c}},9114:c=>{c.exports=function(c,l){return{enumerable:!(1&c),configurable:!(2&c),writable:!(4&c),value:l}}},6135:(c,l,a)=>{"use strict";var e=a(4948),t=a(3070),h=a(9114);c.exports=function(c,l,a){var r=e(l);r in c?t.f(c,r,h(0,a)):c[r]=a}},7045:(c,l,a)=>{var e=a(6339),t=a(3070);c.exports=function(c,l,a){return a.get&&e(a.get,l,{getter:!0}),a.set&&e(a.set,l,{setter:!0}),t.f(c,l,a)}},8052:(c,l,a)=>{var e=a(614),t=a(3070),h=a(6339),r=a(3072);c.exports=function(c,l,a,v){v||(v={});var s=v.enumerable,n=void 0!==v.name?v.name:l;if(e(a)&&h(a,n,v),v.global)s?c[l]=a:r(l,a);else{try{v.unsafe?c[l]&&(s=!0):delete c[l]}catch(c){}s?c[l]=a:t.f(c,l,{value:a,enumerable:!1,configurable:!v.nonConfigurable,writable:!v.nonWritable})}return c}},9190:(c,l,a)=>{var e=a(8052);c.exports=function(c,l,a){for(var t in l)e(c,t,l[t],a);return c}},3072:(c,l,a)=>{var e=a(7854),t=Object.defineProperty;c.exports=function(c,l){try{t(e,c,{value:l,configurable:!0,writable:!0})}catch(a){e[c]=l}return l}},9781:(c,l,a)=>{var e=a(7293);c.exports=!e((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},4154:c=>{var l="object"==typeof document&&document.all,a=void 0===l&&void 0!==l;c.exports={all:l,IS_HTMLDDA:a}},317:(c,l,a)=>{var e=a(7854),t=a(111),h=e.document,r=t(h)&&t(h.createElement);c.exports=function(c){return r?h.createElement(c):{}}},8324:c=>{c.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},8509:(c,l,a)=>{var e=a(317)("span").classList,t=e&&e.constructor&&e.constructor.prototype;c.exports=t===Object.prototype?void 0:t},8113:(c,l,a)=>{var e=a(5005);c.exports=e("navigator","userAgent")||""},7392:(c,l,a)=>{var e,t,h=a(7854),r=a(8113),v=h.process,s=h.Deno,n=v&&v.versions||s&&s.version,z=n&&n.v8;z&&(t=(e=z.split("."))[0]>0&&e[0]<4?1:+(e[0]+e[1])),!t&&r&&(!(e=r.match(/Edge\/(\d+)/))||e[1]>=74)&&(e=r.match(/Chrome\/(\d+)/))&&(t=+e[1]),c.exports=t},748:c=>{c.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:(c,l,a)=>{var e=a(7854),t=a(1236).f,h=a(8880),r=a(8052),v=a(3072),s=a(9920),n=a(4705);c.exports=function(c,l){var a,z,o,i,m,f=c.target,M=c.global,u=c.stat;if(a=M?e:u?e[f]||v(f,{}):(e[f]||{}).prototype)for(z in l){if(i=l[z],o=c.dontCallGetSet?(m=t(a,z))&&m.value:a[z],!n(M?z:f+(u?".":"#")+z,c.forced)&&void 0!==o){if(typeof i==typeof o)continue;s(i,o)}(c.sham||o&&o.sham)&&h(i,"sham",!0),r(a,z,i,c)}}},7293:c=>{c.exports=function(c){try{return!!c()}catch(c){return!0}}},7007:(c,l,a)=>{"use strict";a(4916);var e=a(1470),t=a(8052),h=a(2261),r=a(7293),v=a(5112),s=a(8880),n=v("species"),z=RegExp.prototype;c.exports=function(c,l,a,o){var i=v(c),m=!r((function(){var l={};return l[i]=function(){return 7},7!=""[c](l)})),f=m&&!r((function(){var l=!1,a=/a/;return"split"===c&&((a={}).constructor={},a.constructor[n]=function(){return a},a.flags="",a[i]=/./[i]),a.exec=function(){return l=!0,null},a[i](""),!l}));if(!m||!f||a){var M=e(/./[i]),u=l(i,""[c],(function(c,l,a,t,r){var v=e(c),s=l.exec;return s===h||s===z.exec?m&&!r?{done:!0,value:M(l,a,t)}:{done:!0,value:v(a,l,t)}:{done:!1}}));t(String.prototype,c,u[0]),t(z,i,u[1])}o&&s(z[i],"sham",!0)}},6677:(c,l,a)=>{var e=a(7293);c.exports=!e((function(){return Object.isExtensible(Object.preventExtensions({}))}))},2104:(c,l,a)=>{var e=a(4374),t=Function.prototype,h=t.apply,r=t.call;c.exports="object"==typeof Reflect&&Reflect.apply||(e?r.bind(h):function(){return r.apply(h,arguments)})},9974:(c,l,a)=>{var e=a(1470),t=a(9662),h=a(4374),r=e(e.bind);c.exports=function(c,l){return t(c),void 0===l?c:h?r(c,l):function(){return c.apply(l,arguments)}}},4374:(c,l,a)=>{var e=a(7293);c.exports=!e((function(){var c=function(){}.bind();return"function"!=typeof c||c.hasOwnProperty("prototype")}))},6916:(c,l,a)=>{var e=a(4374),t=Function.prototype.call;c.exports=e?t.bind(t):function(){return t.apply(t,arguments)}},6530:(c,l,a)=>{var e=a(9781),t=a(2597),h=Function.prototype,r=e&&Object.getOwnPropertyDescriptor,v=t(h,"name"),s=v&&"something"===function(){}.name,n=v&&(!e||e&&r(h,"name").configurable);c.exports={EXISTS:v,PROPER:s,CONFIGURABLE:n}},1470:(c,l,a)=>{var e=a(4326),t=a(1702);c.exports=function(c){if("Function"===e(c))return t(c)}},1702:(c,l,a)=>{var e=a(4374),t=Function.prototype,h=t.call,r=e&&t.bind.bind(h,h);c.exports=e?r:function(c){return function(){return h.apply(c,arguments)}}},5005:(c,l,a)=>{var e=a(7854),t=a(614),h=function(c){return t(c)?c:void 0};c.exports=function(c,l){return arguments.length<2?h(e[c]):e[c]&&e[c][l]}},1246:(c,l,a)=>{var e=a(648),t=a(8173),h=a(8554),r=a(7497),v=a(5112)("iterator");c.exports=function(c){if(!h(c))return t(c,v)||t(c,"@@iterator")||r[e(c)]}},4121:(c,l,a)=>{var e=a(6916),t=a(9662),h=a(9670),r=a(6330),v=a(1246),s=TypeError;c.exports=function(c,l){var a=arguments.length<2?v(c):l;if(t(a))return h(e(a,c));throw s(r(c)+" is not iterable")}},8173:(c,l,a)=>{var e=a(9662),t=a(8554);c.exports=function(c,l){var a=c[l];return t(a)?void 0:e(a)}},647:(c,l,a)=>{var e=a(1702),t=a(7908),h=Math.floor,r=e("".charAt),v=e("".replace),s=e("".slice),n=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,z=/\$([$&'`]|\d{1,2})/g;c.exports=function(c,l,a,e,o,i){var m=a+c.length,f=e.length,M=z;return void 0!==o&&(o=t(o),M=n),v(i,M,(function(t,v){var n;switch(r(v,0)){case"$":return"$";case"&":return c;case"`":return s(l,0,a);case"'":return s(l,m);case"<":n=o[s(v,1,-1)];break;default:var z=+v;if(0===z)return t;if(z>f){var i=h(z/10);return 0===i?t:i<=f?void 0===e[i-1]?r(v,1):e[i-1]+r(v,1):t}n=e[z-1]}return void 0===n?"":n}))}},7854:(c,l,a)=>{var e=function(c){return c&&c.Math==Math&&c};c.exports=e("object"==typeof globalThis&&globalThis)||e("object"==typeof window&&window)||e("object"==typeof self&&self)||e("object"==typeof a.g&&a.g)||function(){return this}()||Function("return this")()},2597:(c,l,a)=>{var e=a(1702),t=a(7908),h=e({}.hasOwnProperty);c.exports=Object.hasOwn||function(c,l){return h(t(c),l)}},3501:c=>{c.exports={}},490:(c,l,a)=>{var e=a(5005);c.exports=e("document","documentElement")},4664:(c,l,a)=>{var e=a(9781),t=a(7293),h=a(317);c.exports=!e&&!t((function(){return 7!=Object.defineProperty(h("div"),"a",{get:function(){return 7}}).a}))},8361:(c,l,a)=>{var e=a(1702),t=a(7293),h=a(4326),r=Object,v=e("".split);c.exports=t((function(){return!r("z").propertyIsEnumerable(0)}))?function(c){return"String"==h(c)?v(c,""):r(c)}:r},9587:(c,l,a)=>{var e=a(614),t=a(111),h=a(7674);c.exports=function(c,l,a){var r,v;return h&&e(r=l.constructor)&&r!==a&&t(v=r.prototype)&&v!==a.prototype&&h(c,v),c}},2788:(c,l,a)=>{var e=a(1702),t=a(614),h=a(5465),r=e(Function.toString);t(h.inspectSource)||(h.inspectSource=function(c){return r(c)}),c.exports=h.inspectSource},2423:(c,l,a)=>{var e=a(2109),t=a(1702),h=a(3501),r=a(111),v=a(2597),s=a(3070).f,n=a(8006),z=a(1156),o=a(2050),i=a(9711),m=a(6677),f=!1,M=i("meta"),u=0,H=function(c){s(c,M,{value:{objectID:"O"+u++,weakData:{}}})},V=c.exports={enable:function(){V.enable=function(){},f=!0;var c=n.f,l=t([].splice),a={};a[M]=1,c(a).length&&(n.f=function(a){for(var e=c(a),t=0,h=e.length;t{var e,t,h,r=a(4811),v=a(7854),s=a(111),n=a(8880),z=a(2597),o=a(5465),i=a(6200),m=a(3501),f="Object already initialized",M=v.TypeError,u=v.WeakMap;if(r||o.state){var H=o.state||(o.state=new u);H.get=H.get,H.has=H.has,H.set=H.set,e=function(c,l){if(H.has(c))throw M(f);return l.facade=c,H.set(c,l),l},t=function(c){return H.get(c)||{}},h=function(c){return H.has(c)}}else{var V=i("state");m[V]=!0,e=function(c,l){if(z(c,V))throw M(f);return l.facade=c,n(c,V,l),l},t=function(c){return z(c,V)?c[V]:{}},h=function(c){return z(c,V)}}c.exports={set:e,get:t,has:h,enforce:function(c){return h(c)?t(c):e(c,{})},getterFor:function(c){return function(l){var a;if(!s(l)||(a=t(l)).type!==c)throw M("Incompatible receiver, "+c+" required");return a}}}},7659:(c,l,a)=>{var e=a(5112),t=a(7497),h=e("iterator"),r=Array.prototype;c.exports=function(c){return void 0!==c&&(t.Array===c||r[h]===c)}},3157:(c,l,a)=>{var e=a(4326);c.exports=Array.isArray||function(c){return"Array"==e(c)}},614:(c,l,a)=>{var e=a(4154),t=e.all;c.exports=e.IS_HTMLDDA?function(c){return"function"==typeof c||c===t}:function(c){return"function"==typeof c}},4411:(c,l,a)=>{var e=a(1702),t=a(7293),h=a(614),r=a(648),v=a(5005),s=a(2788),n=function(){},z=[],o=v("Reflect","construct"),i=/^\s*(?:class|function)\b/,m=e(i.exec),f=!i.exec(n),M=function(c){if(!h(c))return!1;try{return o(n,z,c),!0}catch(c){return!1}},u=function(c){if(!h(c))return!1;switch(r(c)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return f||!!m(i,s(c))}catch(c){return!0}};u.sham=!0,c.exports=!o||t((function(){var c;return M(M.call)||!M(Object)||!M((function(){c=!0}))||c}))?u:M},4705:(c,l,a)=>{var e=a(7293),t=a(614),h=/#|\.prototype\./,r=function(c,l){var a=s[v(c)];return a==z||a!=n&&(t(l)?e(l):!!l)},v=r.normalize=function(c){return String(c).replace(h,".").toLowerCase()},s=r.data={},n=r.NATIVE="N",z=r.POLYFILL="P";c.exports=r},8554:c=>{c.exports=function(c){return null==c}},111:(c,l,a)=>{var e=a(614),t=a(4154),h=t.all;c.exports=t.IS_HTMLDDA?function(c){return"object"==typeof c?null!==c:e(c)||c===h}:function(c){return"object"==typeof c?null!==c:e(c)}},1913:c=>{c.exports=!1},7850:(c,l,a)=>{var e=a(111),t=a(4326),h=a(5112)("match");c.exports=function(c){var l;return e(c)&&(void 0!==(l=c[h])?!!l:"RegExp"==t(c))}},2190:(c,l,a)=>{var e=a(5005),t=a(614),h=a(7976),r=a(3307),v=Object;c.exports=r?function(c){return"symbol"==typeof c}:function(c){var l=e("Symbol");return t(l)&&h(l.prototype,v(c))}},408:(c,l,a)=>{var e=a(9974),t=a(6916),h=a(9670),r=a(6330),v=a(7659),s=a(6244),n=a(7976),z=a(4121),o=a(1246),i=a(9212),m=TypeError,f=function(c,l){this.stopped=c,this.result=l},M=f.prototype;c.exports=function(c,l,a){var u,H,V,d,C,L,p,A=a&&a.that,b=!(!a||!a.AS_ENTRIES),g=!(!a||!a.IS_RECORD),y=!(!a||!a.IS_ITERATOR),w=!(!a||!a.INTERRUPTED),S=e(l,A),x=function(c){return u&&i(u,"normal",c),new f(!0,c)},k=function(c){return b?(h(c),w?S(c[0],c[1],x):S(c[0],c[1])):w?S(c,x):S(c)};if(g)u=c.iterator;else if(y)u=c;else{if(!(H=o(c)))throw m(r(c)+" is not iterable");if(v(H)){for(V=0,d=s(c);d>V;V++)if((C=k(c[V]))&&n(M,C))return C;return new f(!1)}u=z(c,H)}for(L=g?c.next:u.next;!(p=t(L,u)).done;){try{C=k(p.value)}catch(c){i(u,"throw",c)}if("object"==typeof C&&C&&n(M,C))return C}return new f(!1)}},9212:(c,l,a)=>{var e=a(6916),t=a(9670),h=a(8173);c.exports=function(c,l,a){var r,v;t(c);try{if(!(r=h(c,"return"))){if("throw"===l)throw a;return a}r=e(r,c)}catch(c){v=!0,r=c}if("throw"===l)throw a;if(v)throw r;return t(r),a}},3061:(c,l,a)=>{"use strict";var e=a(3383).IteratorPrototype,t=a(30),h=a(9114),r=a(8003),v=a(7497),s=function(){return this};c.exports=function(c,l,a,n){var z=l+" Iterator";return c.prototype=t(e,{next:h(+!n,a)}),r(c,z,!1,!0),v[z]=s,c}},1656:(c,l,a)=>{"use strict";var e=a(2109),t=a(6916),h=a(1913),r=a(6530),v=a(614),s=a(3061),n=a(9518),z=a(7674),o=a(8003),i=a(8880),m=a(8052),f=a(5112),M=a(7497),u=a(3383),H=r.PROPER,V=r.CONFIGURABLE,d=u.IteratorPrototype,C=u.BUGGY_SAFARI_ITERATORS,L=f("iterator"),p="keys",A="values",b="entries",g=function(){return this};c.exports=function(c,l,a,r,f,u,y){s(a,l,r);var w,S,x,k=function(c){if(c===f&&T)return T;if(!C&&c in O)return O[c];switch(c){case p:case A:case b:return function(){return new a(this,c)}}return function(){return new a(this)}},Z=l+" Iterator",E=!1,O=c.prototype,j=O[L]||O["@@iterator"]||f&&O[f],T=!C&&j||k(f),P="Array"==l&&O.entries||j;if(P&&(w=n(P.call(new c)))!==Object.prototype&&w.next&&(h||n(w)===d||(z?z(w,d):v(w[L])||m(w,L,g)),o(w,Z,!0,!0),h&&(M[Z]=g)),H&&f==A&&j&&j.name!==A&&(!h&&V?i(O,"name",A):(E=!0,T=function(){return t(j,this)})),f)if(S={values:k(A),keys:u?T:k(p),entries:k(b)},y)for(x in S)(C||E||!(x in O))&&m(O,x,S[x]);else e({target:l,proto:!0,forced:C||E},S);return h&&!y||O[L]===T||m(O,L,T,{name:f}),M[l]=T,S}},3383:(c,l,a)=>{"use strict";var e,t,h,r=a(7293),v=a(614),s=a(111),n=a(30),z=a(9518),o=a(8052),i=a(5112),m=a(1913),f=i("iterator"),M=!1;[].keys&&("next"in(h=[].keys())?(t=z(z(h)))!==Object.prototype&&(e=t):M=!0),!s(e)||r((function(){var c={};return e[f].call(c)!==c}))?e={}:m&&(e=n(e)),v(e[f])||o(e,f,(function(){return this})),c.exports={IteratorPrototype:e,BUGGY_SAFARI_ITERATORS:M}},7497:c=>{c.exports={}},6244:(c,l,a)=>{var e=a(7466);c.exports=function(c){return e(c.length)}},6339:(c,l,a)=>{var e=a(7293),t=a(614),h=a(2597),r=a(9781),v=a(6530).CONFIGURABLE,s=a(2788),n=a(9909),z=n.enforce,o=n.get,i=Object.defineProperty,m=r&&!e((function(){return 8!==i((function(){}),"length",{value:8}).length})),f=String(String).split("String"),M=c.exports=function(c,l,a){"Symbol("===String(l).slice(0,7)&&(l="["+String(l).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),a&&a.getter&&(l="get "+l),a&&a.setter&&(l="set "+l),(!h(c,"name")||v&&c.name!==l)&&(r?i(c,"name",{value:l,configurable:!0}):c.name=l),m&&a&&h(a,"arity")&&c.length!==a.arity&&i(c,"length",{value:a.arity});try{a&&h(a,"constructor")&&a.constructor?r&&i(c,"prototype",{writable:!1}):c.prototype&&(c.prototype=void 0)}catch(c){}var e=z(c);return h(e,"source")||(e.source=f.join("string"==typeof l?l:"")),c};Function.prototype.toString=M((function(){return t(this)&&o(this).source||s(this)}),"toString")},4758:c=>{var l=Math.ceil,a=Math.floor;c.exports=Math.trunc||function(c){var e=+c;return(e>0?a:l)(e)}},3009:(c,l,a)=>{var e=a(7854),t=a(7293),h=a(1702),r=a(1340),v=a(3111).trim,s=a(1361),n=e.parseInt,z=e.Symbol,o=z&&z.iterator,i=/^[+-]?0x/i,m=h(i.exec),f=8!==n(s+"08")||22!==n(s+"0x16")||o&&!t((function(){n(Object(o))}));c.exports=f?function(c,l){var a=v(r(c));return n(a,l>>>0||(m(i,a)?16:10))}:n},30:(c,l,a)=>{var e,t=a(9670),h=a(6048),r=a(748),v=a(3501),s=a(490),n=a(317),z=a(6200),o="prototype",i="script",m=z("IE_PROTO"),f=function(){},M=function(c){return"<"+i+">"+c+""},u=function(c){c.write(M("")),c.close();var l=c.parentWindow.Object;return c=null,l},H=function(){try{e=new ActiveXObject("htmlfile")}catch(c){}var c,l,a;H="undefined"!=typeof document?document.domain&&e?u(e):(l=n("iframe"),a="java"+i+":",l.style.display="none",s.appendChild(l),l.src=String(a),(c=l.contentWindow.document).open(),c.write(M("document.F=Object")),c.close(),c.F):u(e);for(var t=r.length;t--;)delete H[o][r[t]];return H()};v[m]=!0,c.exports=Object.create||function(c,l){var a;return null!==c?(f[o]=t(c),a=new f,f[o]=null,a[m]=c):a=H(),void 0===l?a:h.f(a,l)}},6048:(c,l,a)=>{var e=a(9781),t=a(3353),h=a(3070),r=a(9670),v=a(5656),s=a(1956);l.f=e&&!t?Object.defineProperties:function(c,l){r(c);for(var a,e=v(l),t=s(l),n=t.length,z=0;n>z;)h.f(c,a=t[z++],e[a]);return c}},3070:(c,l,a)=>{var e=a(9781),t=a(4664),h=a(3353),r=a(9670),v=a(4948),s=TypeError,n=Object.defineProperty,z=Object.getOwnPropertyDescriptor,o="enumerable",i="configurable",m="writable";l.f=e?h?function(c,l,a){if(r(c),l=v(l),r(a),"function"==typeof c&&"prototype"===l&&"value"in a&&m in a&&!a[m]){var e=z(c,l);e&&e[m]&&(c[l]=a.value,a={configurable:i in a?a[i]:e[i],enumerable:o in a?a[o]:e[o],writable:!1})}return n(c,l,a)}:n:function(c,l,a){if(r(c),l=v(l),r(a),t)try{return n(c,l,a)}catch(c){}if("get"in a||"set"in a)throw s("Accessors not supported");return"value"in a&&(c[l]=a.value),c}},1236:(c,l,a)=>{var e=a(9781),t=a(6916),h=a(5296),r=a(9114),v=a(5656),s=a(4948),n=a(2597),z=a(4664),o=Object.getOwnPropertyDescriptor;l.f=e?o:function(c,l){if(c=v(c),l=s(l),z)try{return o(c,l)}catch(c){}if(n(c,l))return r(!t(h.f,c,l),c[l])}},1156:(c,l,a)=>{var e=a(4326),t=a(5656),h=a(8006).f,r=a(1589),v="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];c.exports.f=function(c){return v&&"Window"==e(c)?function(c){try{return h(c)}catch(c){return r(v)}}(c):h(t(c))}},8006:(c,l,a)=>{var e=a(6324),t=a(748).concat("length","prototype");l.f=Object.getOwnPropertyNames||function(c){return e(c,t)}},5181:(c,l)=>{l.f=Object.getOwnPropertySymbols},9518:(c,l,a)=>{var e=a(2597),t=a(614),h=a(7908),r=a(6200),v=a(8544),s=r("IE_PROTO"),n=Object,z=n.prototype;c.exports=v?n.getPrototypeOf:function(c){var l=h(c);if(e(l,s))return l[s];var a=l.constructor;return t(a)&&l instanceof a?a.prototype:l instanceof n?z:null}},2050:(c,l,a)=>{var e=a(7293),t=a(111),h=a(4326),r=a(7556),v=Object.isExtensible,s=e((function(){v(1)}));c.exports=s||r?function(c){return!!t(c)&&(!r||"ArrayBuffer"!=h(c))&&(!v||v(c))}:v},7976:(c,l,a)=>{var e=a(1702);c.exports=e({}.isPrototypeOf)},6324:(c,l,a)=>{var e=a(1702),t=a(2597),h=a(5656),r=a(1318).indexOf,v=a(3501),s=e([].push);c.exports=function(c,l){var a,e=h(c),n=0,z=[];for(a in e)!t(v,a)&&t(e,a)&&s(z,a);for(;l.length>n;)t(e,a=l[n++])&&(~r(z,a)||s(z,a));return z}},1956:(c,l,a)=>{var e=a(6324),t=a(748);c.exports=Object.keys||function(c){return e(c,t)}},5296:(c,l)=>{"use strict";var a={}.propertyIsEnumerable,e=Object.getOwnPropertyDescriptor,t=e&&!a.call({1:2},1);l.f=t?function(c){var l=e(this,c);return!!l&&l.enumerable}:a},7674:(c,l,a)=>{var e=a(1702),t=a(9670),h=a(6077);c.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var c,l=!1,a={};try{(c=e(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set))(a,[]),l=a instanceof Array}catch(c){}return function(a,e){return t(a),h(e),l?c(a,e):a.__proto__=e,a}}():void 0)},288:(c,l,a)=>{"use strict";var e=a(1694),t=a(648);c.exports=e?{}.toString:function(){return"[object "+t(this)+"]"}},2140:(c,l,a)=>{var e=a(6916),t=a(614),h=a(111),r=TypeError;c.exports=function(c,l){var a,v;if("string"===l&&t(a=c.toString)&&!h(v=e(a,c)))return v;if(t(a=c.valueOf)&&!h(v=e(a,c)))return v;if("string"!==l&&t(a=c.toString)&&!h(v=e(a,c)))return v;throw r("Can't convert object to primitive value")}},3887:(c,l,a)=>{var e=a(5005),t=a(1702),h=a(8006),r=a(5181),v=a(9670),s=t([].concat);c.exports=e("Reflect","ownKeys")||function(c){var l=h.f(v(c)),a=r.f;return a?s(l,a(c)):l}},857:(c,l,a)=>{var e=a(7854);c.exports=e},2626:(c,l,a)=>{var e=a(3070).f;c.exports=function(c,l,a){a in c||e(c,a,{configurable:!0,get:function(){return l[a]},set:function(c){l[a]=c}})}},7651:(c,l,a)=>{var e=a(6916),t=a(9670),h=a(614),r=a(4326),v=a(2261),s=TypeError;c.exports=function(c,l){var a=c.exec;if(h(a)){var n=e(a,c,l);return null!==n&&t(n),n}if("RegExp"===r(c))return e(v,c,l);throw s("RegExp#exec called on incompatible receiver")}},2261:(c,l,a)=>{"use strict";var e,t,h=a(6916),r=a(1702),v=a(1340),s=a(7066),n=a(2999),z=a(2309),o=a(30),i=a(9909).get,m=a(9441),f=a(7168),M=z("native-string-replace",String.prototype.replace),u=RegExp.prototype.exec,H=u,V=r("".charAt),d=r("".indexOf),C=r("".replace),L=r("".slice),p=(t=/b*/g,h(u,e=/a/,"a"),h(u,t,"a"),0!==e.lastIndex||0!==t.lastIndex),A=n.BROKEN_CARET,b=void 0!==/()??/.exec("")[1];(p||b||A||m||f)&&(H=function(c){var l,a,e,t,r,n,z,m=this,f=i(m),g=v(c),y=f.raw;if(y)return y.lastIndex=m.lastIndex,l=h(H,y,g),m.lastIndex=y.lastIndex,l;var w=f.groups,S=A&&m.sticky,x=h(s,m),k=m.source,Z=0,E=g;if(S&&(x=C(x,"y",""),-1===d(x,"g")&&(x+="g"),E=L(g,m.lastIndex),m.lastIndex>0&&(!m.multiline||m.multiline&&"\n"!==V(g,m.lastIndex-1))&&(k="(?: "+k+")",E=" "+E,Z++),a=new RegExp("^(?:"+k+")",x)),b&&(a=new RegExp("^"+k+"$(?!\\s)",x)),p&&(e=m.lastIndex),t=h(u,S?a:m,E),S?t?(t.input=L(t.input,Z),t[0]=L(t[0],Z),t.index=m.lastIndex,m.lastIndex+=t[0].length):m.lastIndex=0:p&&t&&(m.lastIndex=m.global?t.index+t[0].length:e),b&&t&&t.length>1&&h(M,t[0],a,(function(){for(r=1;r{"use strict";var e=a(9670);c.exports=function(){var c=e(this),l="";return c.hasIndices&&(l+="d"),c.global&&(l+="g"),c.ignoreCase&&(l+="i"),c.multiline&&(l+="m"),c.dotAll&&(l+="s"),c.unicode&&(l+="u"),c.unicodeSets&&(l+="v"),c.sticky&&(l+="y"),l}},4706:(c,l,a)=>{var e=a(6916),t=a(2597),h=a(7976),r=a(7066),v=RegExp.prototype;c.exports=function(c){var l=c.flags;return void 0!==l||"flags"in v||t(c,"flags")||!h(v,c)?l:e(r,c)}},2999:(c,l,a)=>{var e=a(7293),t=a(7854).RegExp,h=e((function(){var c=t("a","y");return c.lastIndex=2,null!=c.exec("abcd")})),r=h||e((function(){return!t("a","y").sticky})),v=h||e((function(){var c=t("^r","gy");return c.lastIndex=2,null!=c.exec("str")}));c.exports={BROKEN_CARET:v,MISSED_STICKY:r,UNSUPPORTED_Y:h}},9441:(c,l,a)=>{var e=a(7293),t=a(7854).RegExp;c.exports=e((function(){var c=t(".","s");return!(c.dotAll&&c.exec("\n")&&"s"===c.flags)}))},7168:(c,l,a)=>{var e=a(7293),t=a(7854).RegExp;c.exports=e((function(){var c=t("(?b)","g");return"b"!==c.exec("b").groups.a||"bc"!=="b".replace(c,"$c")}))},4488:(c,l,a)=>{var e=a(8554),t=TypeError;c.exports=function(c){if(e(c))throw t("Can't call method on "+c);return c}},6340:(c,l,a)=>{"use strict";var e=a(5005),t=a(3070),h=a(5112),r=a(9781),v=h("species");c.exports=function(c){var l=e(c),a=t.f;r&&l&&!l[v]&&a(l,v,{configurable:!0,get:function(){return this}})}},8003:(c,l,a)=>{var e=a(3070).f,t=a(2597),h=a(5112)("toStringTag");c.exports=function(c,l,a){c&&!a&&(c=c.prototype),c&&!t(c,h)&&e(c,h,{configurable:!0,value:l})}},6200:(c,l,a)=>{var e=a(2309),t=a(9711),h=e("keys");c.exports=function(c){return h[c]||(h[c]=t(c))}},5465:(c,l,a)=>{var e=a(7854),t=a(3072),h="__core-js_shared__",r=e[h]||t(h,{});c.exports=r},2309:(c,l,a)=>{var e=a(1913),t=a(5465);(c.exports=function(c,l){return t[c]||(t[c]=void 0!==l?l:{})})("versions",[]).push({version:"3.27.1",mode:e?"pure":"global",copyright:"© 2014-2022 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.27.1/LICENSE",source:"https://github.com/zloirock/core-js"})},8710:(c,l,a)=>{var e=a(1702),t=a(9303),h=a(1340),r=a(4488),v=e("".charAt),s=e("".charCodeAt),n=e("".slice),z=function(c){return function(l,a){var e,z,o=h(r(l)),i=t(a),m=o.length;return i<0||i>=m?c?"":void 0:(e=s(o,i))<55296||e>56319||i+1===m||(z=s(o,i+1))<56320||z>57343?c?v(o,i):e:c?n(o,i,i+2):z-56320+(e-55296<<10)+65536}};c.exports={codeAt:z(!1),charAt:z(!0)}},3111:(c,l,a)=>{var e=a(1702),t=a(4488),h=a(1340),r=a(1361),v=e("".replace),s="["+r+"]",n=RegExp("^"+s+s+"*"),z=RegExp(s+s+"*$"),o=function(c){return function(l){var a=h(t(l));return 1&c&&(a=v(a,n,"")),2&c&&(a=v(a,z,"")),a}};c.exports={start:o(1),end:o(2),trim:o(3)}},6293:(c,l,a)=>{var e=a(7392),t=a(7293);c.exports=!!Object.getOwnPropertySymbols&&!t((function(){var c=Symbol();return!String(c)||!(Object(c)instanceof Symbol)||!Symbol.sham&&e&&e<41}))},863:(c,l,a)=>{var e=a(1702);c.exports=e(1..valueOf)},1400:(c,l,a)=>{var e=a(9303),t=Math.max,h=Math.min;c.exports=function(c,l){var a=e(c);return a<0?t(a+l,0):h(a,l)}},5656:(c,l,a)=>{var e=a(8361),t=a(4488);c.exports=function(c){return e(t(c))}},9303:(c,l,a)=>{var e=a(4758);c.exports=function(c){var l=+c;return l!=l||0===l?0:e(l)}},7466:(c,l,a)=>{var e=a(9303),t=Math.min;c.exports=function(c){return c>0?t(e(c),9007199254740991):0}},7908:(c,l,a)=>{var e=a(4488),t=Object;c.exports=function(c){return t(e(c))}},7593:(c,l,a)=>{var e=a(6916),t=a(111),h=a(2190),r=a(8173),v=a(2140),s=a(5112),n=TypeError,z=s("toPrimitive");c.exports=function(c,l){if(!t(c)||h(c))return c;var a,s=r(c,z);if(s){if(void 0===l&&(l="default"),a=e(s,c,l),!t(a)||h(a))return a;throw n("Can't convert object to primitive value")}return void 0===l&&(l="number"),v(c,l)}},4948:(c,l,a)=>{var e=a(7593),t=a(2190);c.exports=function(c){var l=e(c,"string");return t(l)?l:l+""}},1694:(c,l,a)=>{var e={};e[a(5112)("toStringTag")]="z",c.exports="[object z]"===String(e)},1340:(c,l,a)=>{var e=a(648),t=String;c.exports=function(c){if("Symbol"===e(c))throw TypeError("Cannot convert a Symbol value to a string");return t(c)}},6330:c=>{var l=String;c.exports=function(c){try{return l(c)}catch(c){return"Object"}}},9711:(c,l,a)=>{var e=a(1702),t=0,h=Math.random(),r=e(1..toString);c.exports=function(c){return"Symbol("+(void 0===c?"":c)+")_"+r(++t+h,36)}},3307:(c,l,a)=>{var e=a(6293);c.exports=e&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3353:(c,l,a)=>{var e=a(9781),t=a(7293);c.exports=e&&t((function(){return 42!=Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},4811:(c,l,a)=>{var e=a(7854),t=a(614),h=e.WeakMap;c.exports=t(h)&&/native code/.test(String(h))},5112:(c,l,a)=>{var e=a(7854),t=a(2309),h=a(2597),r=a(9711),v=a(6293),s=a(3307),n=t("wks"),z=e.Symbol,o=z&&z.for,i=s?z:z&&z.withoutSetter||r;c.exports=function(c){if(!h(n,c)||!v&&"string"!=typeof n[c]){var l="Symbol."+c;v&&h(z,c)?n[c]=z[c]:n[c]=s&&o?o(l):i(l)}return n[c]}},1361:c=>{c.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},9826:(c,l,a)=>{"use strict";var e=a(2109),t=a(2092).find,h=a(1223),r="find",v=!0;r in[]&&Array(1)[r]((function(){v=!1})),e({target:"Array",proto:!0,forced:v},{find:function(c){return t(this,c,arguments.length>1?arguments[1]:void 0)}}),h(r)},6992:(c,l,a)=>{"use strict";var e=a(5656),t=a(1223),h=a(7497),r=a(9909),v=a(3070).f,s=a(1656),n=a(6178),z=a(1913),o=a(9781),i="Array Iterator",m=r.set,f=r.getterFor(i);c.exports=s(Array,"Array",(function(c,l){m(this,{type:i,target:e(c),index:0,kind:l})}),(function(){var c=f(this),l=c.target,a=c.kind,e=c.index++;return!l||e>=l.length?(c.target=void 0,n(void 0,!0)):n("keys"==a?e:"values"==a?l[e]:[e,l[e]],!1)}),"values");var M=h.Arguments=h.Array;if(t("keys"),t("values"),t("entries"),!z&&o&&"values"!==M.name)try{v(M,"name",{value:"values"})}catch(c){}},1249:(c,l,a)=>{"use strict";var e=a(2109),t=a(2092).map;e({target:"Array",proto:!0,forced:!a(1194)("map")},{map:function(c){return t(this,c,arguments.length>1?arguments[1]:void 0)}})},9098:(c,l,a)=>{"use strict";a(7710)("Map",(function(c){return function(){return c(this,arguments.length?arguments[0]:void 0)}}),a(5631))},1532:(c,l,a)=>{a(9098)},9653:(c,l,a)=>{"use strict";var e=a(2109),t=a(1913),h=a(9781),r=a(7854),v=a(857),s=a(1702),n=a(4705),z=a(2597),o=a(9587),i=a(7976),m=a(2190),f=a(7593),M=a(7293),u=a(8006).f,H=a(1236).f,V=a(3070).f,d=a(863),C=a(3111).trim,L="Number",p=r[L],A=v[L],b=p.prototype,g=r.TypeError,y=s("".slice),w=s("".charCodeAt),S=function(c){var l=f(c,"number");return"bigint"==typeof l?l:x(l)},x=function(c){var l,a,e,t,h,r,v,s,n=f(c,"number");if(m(n))throw g("Cannot convert a Symbol value to a number");if("string"==typeof n&&n.length>2)if(n=C(n),43===(l=w(n,0))||45===l){if(88===(a=w(n,2))||120===a)return NaN}else if(48===l){switch(w(n,1)){case 66:case 98:e=2,t=49;break;case 79:case 111:e=8,t=55;break;default:return+n}for(r=(h=y(n,2)).length,v=0;vt)return NaN;return parseInt(h,e)}return+n},k=n(L,!p(" 0o1")||!p("0b1")||p("+0x1")),Z=function(c){return i(b,c)&&M((function(){d(c)}))},E=function(c){var l=arguments.length<1?0:p(S(c));return Z(this)?o(Object(l),this,E):l};E.prototype=b,k&&!t&&(b.constructor=E),e({global:!0,constructor:!0,wrap:!0,forced:k},{Number:E});var O=function(c,l){for(var a,e=h?u(l):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,fromString,range".split(","),t=0;e.length>t;t++)z(l,a=e[t])&&!z(c,a)&&V(c,a,H(l,a))};t&&A&&O(v[L],A),(k||t)&&O(v[L],p)},1539:(c,l,a)=>{var e=a(1694),t=a(8052),h=a(288);e||t(Object.prototype,"toString",h,{unsafe:!0})},1058:(c,l,a)=>{var e=a(2109),t=a(3009);e({global:!0,forced:parseInt!=t},{parseInt:t})},4603:(c,l,a)=>{var e=a(9781),t=a(7854),h=a(1702),r=a(4705),v=a(9587),s=a(8880),n=a(8006).f,z=a(7976),o=a(7850),i=a(1340),m=a(4706),f=a(2999),M=a(2626),u=a(8052),H=a(7293),V=a(2597),d=a(9909).enforce,C=a(6340),L=a(5112),p=a(9441),A=a(7168),b=L("match"),g=t.RegExp,y=g.prototype,w=t.SyntaxError,S=h(y.exec),x=h("".charAt),k=h("".replace),Z=h("".indexOf),E=h("".slice),O=/^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/,j=/a/g,T=/a/g,P=new g(j)!==j,R=f.MISSED_STICKY,I=f.UNSUPPORTED_Y;if(r("RegExp",e&&(!P||R||p||A||H((function(){return T[b]=!1,g(j)!=j||g(T)==T||"/a/i"!=g(j,"i")}))))){for(var _=function(c,l){var a,e,t,h,r,n,f=z(y,this),M=o(c),u=void 0===l,H=[],C=c;if(!f&&M&&u&&c.constructor===_)return c;if((M||z(y,c))&&(c=c.source,u&&(l=m(C))),c=void 0===c?"":i(c),l=void 0===l?"":i(l),C=c,p&&"dotAll"in j&&(e=!!l&&Z(l,"s")>-1)&&(l=k(l,/s/g,"")),a=l,R&&"sticky"in j&&(t=!!l&&Z(l,"y")>-1)&&I&&(l=k(l,/y/g,"")),A&&(h=function(c){for(var l,a=c.length,e=0,t="",h=[],r={},v=!1,s=!1,n=0,z="";e<=a;e++){if("\\"===(l=x(c,e)))l+=x(c,++e);else if("]"===l)v=!1;else if(!v)switch(!0){case"["===l:v=!0;break;case"("===l:S(O,E(c,e+1))&&(e+=2,s=!0),t+=l,n++;continue;case">"===l&&s:if(""===z||V(r,z))throw new w("Invalid capture group name");r[z]=!0,h[h.length]=[z,n],s=!1,z="";continue}s?z+=l:t+=l}return[t,h]}(c),c=h[0],H=h[1]),r=v(g(c,l),f?this:y,_),(e||t||H.length)&&(n=d(r),e&&(n.dotAll=!0,n.raw=_(function(c){for(var l,a=c.length,e=0,t="",h=!1;e<=a;e++)"\\"!==(l=x(c,e))?h||"."!==l?("["===l?h=!0:"]"===l&&(h=!1),t+=l):t+="[\\s\\S]":t+=l+x(c,++e);return t}(c),a)),t&&(n.sticky=!0),H.length&&(n.groups=H)),c!==C)try{s(r,"source",""===C?"(?:)":C)}catch(c){}return r},q=n(g),N=0;q.length>N;)M(_,g,q[N++]);y.constructor=_,_.prototype=y,u(t,"RegExp",_,{constructor:!0})}C("RegExp")},8450:(c,l,a)=>{var e=a(9781),t=a(9441),h=a(4326),r=a(7045),v=a(9909).get,s=RegExp.prototype,n=TypeError;e&&t&&r(s,"dotAll",{configurable:!0,get:function(){if(this!==s){if("RegExp"===h(this))return!!v(this).dotAll;throw n("Incompatible receiver, RegExp required")}}})},4916:(c,l,a)=>{"use strict";var e=a(2109),t=a(2261);e({target:"RegExp",proto:!0,forced:/./.exec!==t},{exec:t})},8386:(c,l,a)=>{var e=a(9781),t=a(2999).MISSED_STICKY,h=a(4326),r=a(7045),v=a(9909).get,s=RegExp.prototype,n=TypeError;e&&t&&r(s,"sticky",{configurable:!0,get:function(){if(this!==s){if("RegExp"===h(this))return!!v(this).sticky;throw n("Incompatible receiver, RegExp required")}}})},7601:(c,l,a)=>{"use strict";a(4916);var e,t,h=a(2109),r=a(6916),v=a(614),s=a(9670),n=a(1340),z=(e=!1,(t=/[ac]/).exec=function(){return e=!0,/./.exec.apply(this,arguments)},!0===t.test("abc")&&e),o=/./.test;h({target:"RegExp",proto:!0,forced:!z},{test:function(c){var l=s(this),a=n(c),e=l.exec;if(!v(e))return r(o,l,a);var t=r(e,l,a);return null!==t&&(s(t),!0)}})},9714:(c,l,a)=>{"use strict";var e=a(6530).PROPER,t=a(8052),h=a(9670),r=a(1340),v=a(7293),s=a(4706),n="toString",z=RegExp.prototype[n],o=v((function(){return"/a/b"!=z.call({source:"a",flags:"b"})})),i=e&&z.name!=n;(o||i)&&t(RegExp.prototype,n,(function(){var c=h(this);return"/"+r(c.source)+"/"+r(s(c))}),{unsafe:!0})},8783:(c,l,a)=>{"use strict";var e=a(8710).charAt,t=a(1340),h=a(9909),r=a(1656),v=a(6178),s="String Iterator",n=h.set,z=h.getterFor(s);r(String,"String",(function(c){n(this,{type:s,string:t(c),index:0})}),(function(){var c,l=z(this),a=l.string,t=l.index;return t>=a.length?v(void 0,!0):(c=e(a,t),l.index+=c.length,v(c,!1))}))},4723:(c,l,a)=>{"use strict";var e=a(6916),t=a(7007),h=a(9670),r=a(8554),v=a(7466),s=a(1340),n=a(4488),z=a(8173),o=a(1530),i=a(7651);t("match",(function(c,l,a){return[function(l){var a=n(this),t=r(l)?void 0:z(l,c);return t?e(t,l,a):new RegExp(l)[c](s(a))},function(c){var e=h(this),t=s(c),r=a(l,e,t);if(r.done)return r.value;if(!e.global)return i(e,t);var n=e.unicode;e.lastIndex=0;for(var z,m=[],f=0;null!==(z=i(e,t));){var M=s(z[0]);m[f]=M,""===M&&(e.lastIndex=o(t,v(e.lastIndex),n)),f++}return 0===f?null:m}]}))},5306:(c,l,a)=>{"use strict";var e=a(2104),t=a(6916),h=a(1702),r=a(7007),v=a(7293),s=a(9670),n=a(614),z=a(8554),o=a(9303),i=a(7466),m=a(1340),f=a(4488),M=a(1530),u=a(8173),H=a(647),V=a(7651),d=a(5112)("replace"),C=Math.max,L=Math.min,p=h([].concat),A=h([].push),b=h("".indexOf),g=h("".slice),y="$0"==="a".replace(/./,"$0"),w=!!/./[d]&&""===/./[d]("a","$0");r("replace",(function(c,l,a){var h=w?"$":"$0";return[function(c,a){var e=f(this),h=z(c)?void 0:u(c,d);return h?t(h,c,e,a):t(l,m(e),c,a)},function(c,t){var r=s(this),v=m(c);if("string"==typeof t&&-1===b(t,h)&&-1===b(t,"$<")){var z=a(l,r,v,t);if(z.done)return z.value}var f=n(t);f||(t=m(t));var u=r.global;if(u){var d=r.unicode;r.lastIndex=0}for(var y=[];;){var w=V(r,v);if(null===w)break;if(A(y,w),!u)break;""===m(w[0])&&(r.lastIndex=M(v,i(r.lastIndex),d))}for(var S,x="",k=0,Z=0;Z=k&&(x+=g(v,k,O)+I,k=O+E.length)}return x+g(v,k)}]}),!!v((function(){var c=/./;return c.exec=function(){var c=[];return c.groups={a:"7"},c},"7"!=="".replace(c,"$")}))||!y||w)},4747:(c,l,a)=>{var e=a(7854),t=a(8324),h=a(8509),r=a(8533),v=a(8880),s=function(c){if(c&&c.forEach!==r)try{v(c,"forEach",r)}catch(l){c.forEach=r}};for(var n in t)t[n]&&s(e[n]&&e[n].prototype);s(h)},3948:(c,l,a)=>{var e=a(7854),t=a(8324),h=a(8509),r=a(6992),v=a(8880),s=a(5112),n=s("iterator"),z=s("toStringTag"),o=r.values,i=function(c,l){if(c){if(c[n]!==o)try{v(c,n,o)}catch(l){c[n]=o}if(c[z]||v(c,z,l),t[l])for(var a in r)if(c[a]!==r[a])try{v(c,a,r[a])}catch(l){c[a]=r[a]}}};for(var m in t)i(e[m]&&e[m].prototype,m);i(h,"DOMTokenList")},6729:c=>{"use strict";var l=Object.prototype.hasOwnProperty,a="~";function e(){}function t(c,l,a){this.fn=c,this.context=l,this.once=a||!1}function h(c,l,e,h,r){if("function"!=typeof e)throw new TypeError("The listener must be a function");var v=new t(e,h||c,r),s=a?a+l:l;return c._events[s]?c._events[s].fn?c._events[s]=[c._events[s],v]:c._events[s].push(v):(c._events[s]=v,c._eventsCount++),c}function r(c,l){0==--c._eventsCount?c._events=new e:delete c._events[l]}function v(){this._events=new e,this._eventsCount=0}Object.create&&(e.prototype=Object.create(null),(new e).__proto__||(a=!1)),v.prototype.eventNames=function(){var c,e,t=[];if(0===this._eventsCount)return t;for(e in c=this._events)l.call(c,e)&&t.push(a?e.slice(1):e);return Object.getOwnPropertySymbols?t.concat(Object.getOwnPropertySymbols(c)):t},v.prototype.listeners=function(c){var l=a?a+c:c,e=this._events[l];if(!e)return[];if(e.fn)return[e.fn];for(var t=0,h=e.length,r=new Array(h);t{var l=c&&c.__esModule?()=>c.default:()=>c;return a.d(l,{a:l}),l},a.d=(c,l)=>{for(var e in l)a.o(l,e)&&!a.o(c,e)&&Object.defineProperty(c,e,{enumerable:!0,get:l[e]})},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(c){if("object"==typeof window)return window}}(),a.o=(c,l)=>Object.prototype.hasOwnProperty.call(c,l),(()=>{"use strict";a(4916),a(4723);var c=a(7162),l=a.n(c);function e(c,l){(null==l||l>c.length)&&(l=c.length);for(var a=0,e=new Array(l);a2&&void 0!==arguments[2]&&arguments[2];return function(){var t=this,h=arguments;a||(e?(a=setTimeout((function(){a=void 0}),l),c.apply(this,h)):a=setTimeout((function(){a=void 0,c.apply(t,h)}),l))}};var f,M=0,u=$(".banner:first"),H=!1,V=u.height()+n();function d(c){t(c.children).forEach((function(c){t(c.querySelectorAll("ol")).forEach((function(c){c.style.display="none"}))})),t(c.querySelectorAll(".toc-active")).forEach((function(c){c.classList.remove("toc-active")}))}function C(c){t(c.children).forEach((function(c){!function(c){c.style.display=""}(c)}))}const L=function(){var c=document.querySelector(".toc"),l=$(".toc"),a=document.querySelectorAll(".toc-item");if(a.length){var e=document.querySelectorAll(".toc-link"),h=document.querySelectorAll(".anchorjs-link"),r=document.querySelectorAll(".article-entry h1, h2, h3, h4, h5, h6");d(c);var s=function(){for(var s=function(c){return t(c).map((function(c){return v(c,!0).y}))}(r),o=function(){var c=s[i]-V,l=r[i].id,a=function(){H=!0,window.preventPostPageBannerDefault=!0,u.addClass("banner-show"),z(l),window.scrollTo({top:c})};e[i].onclick=function(){return a(),!1},h.length&&h.length>i&&(h[i].onclick=function(){return a(),!1})},i=0;i=0)return a>l||H?e:e-1>=0?e-1:0}(s,M,t);if(M=t,void 0!==h){var v=a[h];!function(c){d(c)}(c),function(c){for(var l=c;l&&l.parentNode&&(C(l.parentNode),C(l),!(l=l.parentNode).classList.contains("toc")););}(v),v&&v.querySelector("a").classList.add("toc-active");var o=(null==v?void 0:v.offsetTop)||void 0;o&&l.scrollTop(o);var i=(null===(e=r[h])||void 0===e?void 0:e.id)||void 0;H||void 0===i||z(i),H=!1}};L(),f&&$(document).off("scroll",f),f=m(L,100,!0),$(document).on("scroll",f)};s(),$(window).on("resize",m(s,100,!0)),$(".toc-wrapper").removeClass("toc-wrapper-loding"),window.addEventListener("load",s())}};a(2382),a(6402),a(3911);function p(c){return p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(c){return typeof c}:function(c){return c&&"function"==typeof Symbol&&c.constructor===Symbol&&c!==Symbol.prototype?"symbol":typeof c},p(c)}function A(c){var l=function(c,l){if("object"!==p(c)||null===c)return c;var a=c[Symbol.toPrimitive];if(void 0!==a){var e=a.call(c,"string");if("object"!==p(e))return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(c)}(c);return"symbol"===p(l)?l:String(l)}function b(c,l,a){return(l=A(l))in c?Object.defineProperty(c,l,{value:a,enumerable:!0,configurable:!0,writable:!0}):c[l]=a,c}function g(c,l){var a=Object.keys(c);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(c);l&&(e=e.filter((function(l){return Object.getOwnPropertyDescriptor(c,l).enumerable}))),a.push.apply(a,e)}return a}function y(c){for(var l=1;lc[h]-c[r]-1&&(c.reach[s]="end"),l&&(o.dispatchEvent(U("ps-scroll-"+s)),l<0?o.dispatchEvent(U("ps-scroll-"+n)):l>0&&o.dispatchEvent(U("ps-scroll-"+z)),e&&function(c,l){W(c,l),B(c,l)}(c,s)),c.reach[s]&&(l||t)&&o.dispatchEvent(U("ps-"+s+"-reach-"+c.reach[s]))}(c,a,h,e,t)}function J(c){return parseInt(c,10)||0}Q.prototype.eventElement=function(c){var l=this.eventElements.filter((function(l){return l.element===c}))[0];return l||(l=new F(c),this.eventElements.push(l)),l},Q.prototype.bind=function(c,l,a){this.eventElement(c).bind(l,a)},Q.prototype.unbind=function(c,l,a){var e=this.eventElement(c);e.unbind(l,a),e.isEmpty&&this.eventElements.splice(this.eventElements.indexOf(e),1)},Q.prototype.unbindAll=function(){this.eventElements.forEach((function(c){return c.unbindAll()})),this.eventElements=[]},Q.prototype.once=function(c,l,a){var e=this.eventElement(c),t=function(c){e.unbind(l,t),a(c)};e.bind(l,t)};var cc={isWebKit:"undefined"!=typeof document&&"WebkitAppearance"in document.documentElement.style,supportsTouch:"undefined"!=typeof window&&("ontouchstart"in window||"maxTouchPoints"in window.navigator&&window.navigator.maxTouchPoints>0||window.DocumentTouch&&document instanceof window.DocumentTouch),supportsIePointer:"undefined"!=typeof navigator&&navigator.msMaxTouchPoints,isChrome:"undefined"!=typeof navigator&&/Chrome/i.test(navigator&&navigator.userAgent)};function lc(c){var l=c.element,a=Math.floor(l.scrollTop),e=l.getBoundingClientRect();c.containerWidth=Math.round(e.width),c.containerHeight=Math.round(e.height),c.contentWidth=l.scrollWidth,c.contentHeight=l.scrollHeight,l.contains(c.scrollbarXRail)||(P(l,I("x")).forEach((function(c){return T(c)})),l.appendChild(c.scrollbarXRail)),l.contains(c.scrollbarYRail)||(P(l,I("y")).forEach((function(c){return T(c)})),l.appendChild(c.scrollbarYRail)),!c.settings.suppressScrollX&&c.containerWidth+c.settings.scrollXMarginOffset=c.railXWidth-c.scrollbarXWidth&&(c.scrollbarXLeft=c.railXWidth-c.scrollbarXWidth),c.scrollbarYTop>=c.railYHeight-c.scrollbarYHeight&&(c.scrollbarYTop=c.railYHeight-c.scrollbarYHeight),function(c,l){var a={width:l.railXWidth},e=Math.floor(c.scrollTop);l.isRtl?a.left=l.negativeScrollAdjustment+c.scrollLeft+l.containerWidth-l.contentWidth:a.left=c.scrollLeft,l.isScrollbarXUsingBottom?a.bottom=l.scrollbarXBottom-e:a.top=l.scrollbarXTop+e,Z(l.scrollbarXRail,a);var t={top:e,height:l.railYHeight};l.isScrollbarYUsingRight?l.isRtl?t.right=l.contentWidth-(l.negativeScrollAdjustment+c.scrollLeft)-l.scrollbarYRight-l.scrollbarYOuterWidth-9:t.right=l.scrollbarYRight-c.scrollLeft:l.isRtl?t.left=l.negativeScrollAdjustment+c.scrollLeft+2*l.containerWidth-l.contentWidth-l.scrollbarYLeft-l.scrollbarYOuterWidth:t.left=l.scrollbarYLeft+c.scrollLeft,Z(l.scrollbarYRail,t),Z(l.scrollbarX,{left:l.scrollbarXLeft,width:l.scrollbarXWidth-l.railBorderXWidth}),Z(l.scrollbarY,{top:l.scrollbarYTop,height:l.scrollbarYHeight-l.railBorderYWidth})}(l,c),c.scrollbarXActive?l.classList.add(Y("x")):(l.classList.remove(Y("x")),c.scrollbarXWidth=0,c.scrollbarXLeft=0,l.scrollLeft=!0===c.isRtl?c.contentWidth:0),c.scrollbarYActive?l.classList.add(Y("y")):(l.classList.remove(Y("y")),c.scrollbarYHeight=0,c.scrollbarYTop=0,l.scrollTop=0)}function ac(c,l){return c.settings.minScrollbarLength&&(l=Math.max(l,c.settings.minScrollbarLength)),c.settings.maxScrollbarLength&&(l=Math.min(l,c.settings.maxScrollbarLength)),l}function ec(c,l){var a=l[0],e=l[1],t=l[2],h=l[3],r=l[4],v=l[5],s=l[6],n=l[7],z=l[8],o=c.element,i=null,m=null,f=null;function M(l){l.touches&&l.touches[0]&&(l[t]=l.touches[0].pageY),o[s]=i+f*(l[t]-m),W(c,n),lc(c),l.stopPropagation(),l.type.startsWith("touch")&&l.changedTouches.length>1&&l.preventDefault()}function u(){B(c,n),c[z].classList.remove(N),c.event.unbind(c.ownerDocument,"mousemove",M)}function H(l,r){i=o[s],r&&l.touches&&(l[t]=l.touches[0].pageY),m=l[t],f=(c[e]-c[a])/(c[h]-c[v]),r?c.event.bind(c.ownerDocument,"touchmove",M):(c.event.bind(c.ownerDocument,"mousemove",M),c.event.once(c.ownerDocument,"mouseup",u),l.preventDefault()),c[z].classList.add(N),l.stopPropagation()}c.event.bind(c[r],"mousedown",(function(c){H(c)})),c.event.bind(c[r],"touchstart",(function(c){H(c,!0)}))}var tc={"click-rail":function(c){c.element,c.event.bind(c.scrollbarY,"mousedown",(function(c){return c.stopPropagation()})),c.event.bind(c.scrollbarYRail,"mousedown",(function(l){var a=l.pageY-window.pageYOffset-c.scrollbarYRail.getBoundingClientRect().top>c.scrollbarYTop?1:-1;c.element.scrollTop+=a*c.containerHeight,lc(c),l.stopPropagation()})),c.event.bind(c.scrollbarX,"mousedown",(function(c){return c.stopPropagation()})),c.event.bind(c.scrollbarXRail,"mousedown",(function(l){var a=l.pageX-window.pageXOffset-c.scrollbarXRail.getBoundingClientRect().left>c.scrollbarXLeft?1:-1;c.element.scrollLeft+=a*c.containerWidth,lc(c),l.stopPropagation()}))},"drag-thumb":function(c){ec(c,["containerWidth","contentWidth","pageX","railXWidth","scrollbarX","scrollbarXWidth","scrollLeft","x","scrollbarXRail"]),ec(c,["containerHeight","contentHeight","pageY","railYHeight","scrollbarY","scrollbarYHeight","scrollTop","y","scrollbarYRail"])},keyboard:function(c){var l=c.element;c.event.bind(c.ownerDocument,"keydown",(function(a){if(!(a.isDefaultPrevented&&a.isDefaultPrevented()||a.defaultPrevented)&&(j(l,":hover")||j(c.scrollbarX,":focus")||j(c.scrollbarY,":focus"))){var e,t=document.activeElement?document.activeElement:c.ownerDocument.activeElement;if(t){if("IFRAME"===t.tagName)t=t.contentDocument.activeElement;else for(;t.shadowRoot;)t=t.shadowRoot.activeElement;if(j(e=t,"input,[contenteditable]")||j(e,"select,[contenteditable]")||j(e,"textarea,[contenteditable]")||j(e,"button,[contenteditable]"))return}var h=0,r=0;switch(a.which){case 37:h=a.metaKey?-c.contentWidth:a.altKey?-c.containerWidth:-30;break;case 38:r=a.metaKey?c.contentHeight:a.altKey?c.containerHeight:30;break;case 39:h=a.metaKey?c.contentWidth:a.altKey?c.containerWidth:30;break;case 40:r=a.metaKey?-c.contentHeight:a.altKey?-c.containerHeight:-30;break;case 32:r=a.shiftKey?c.containerHeight:-c.containerHeight;break;case 33:r=c.containerHeight;break;case 34:r=-c.containerHeight;break;case 36:r=c.contentHeight;break;case 35:r=-c.contentHeight;break;default:return}c.settings.suppressScrollX&&0!==h||c.settings.suppressScrollY&&0!==r||(l.scrollTop-=r,l.scrollLeft+=h,lc(c),function(a,e){var t=Math.floor(l.scrollTop);if(0===a){if(!c.scrollbarYActive)return!1;if(0===t&&e>0||t>=c.contentHeight-c.containerHeight&&e<0)return!c.settings.wheelPropagation}var h=l.scrollLeft;if(0===e){if(!c.scrollbarXActive)return!1;if(0===h&&a<0||h>=c.contentWidth-c.containerWidth&&a>0)return!c.settings.wheelPropagation}return!0}(h,r)&&a.preventDefault())}}))},wheel:function(c){var l=c.element;function a(a){var e=function(c){var l=c.deltaX,a=-1*c.deltaY;return void 0!==l&&void 0!==a||(l=-1*c.wheelDeltaX/6,a=c.wheelDeltaY/6),c.deltaMode&&1===c.deltaMode&&(l*=10,a*=10),l!=l&&a!=a&&(l=0,a=c.wheelDelta),c.shiftKey?[-a,-l]:[l,a]}(a),t=e[0],h=e[1];if(!function(c,a,e){if(!cc.isWebKit&&l.querySelector("select:focus"))return!0;if(!l.contains(c))return!1;for(var t=c;t&&t!==l;){if(t.classList.contains(_))return!0;var h=k(t);if(e&&h.overflowY.match(/(scroll|auto)/)){var r=t.scrollHeight-t.clientHeight;if(r>0&&(t.scrollTop>0&&e<0||t.scrollTop0))return!0}if(a&&h.overflowX.match(/(scroll|auto)/)){var v=t.scrollWidth-t.clientWidth;if(v>0&&(t.scrollLeft>0&&a<0||t.scrollLeft0))return!0}t=t.parentNode}return!1}(a.target,t,h)){var r=!1;c.settings.useBothWheelAxes?c.scrollbarYActive&&!c.scrollbarXActive?(h?l.scrollTop-=h*c.settings.wheelSpeed:l.scrollTop+=t*c.settings.wheelSpeed,r=!0):c.scrollbarXActive&&!c.scrollbarYActive&&(t?l.scrollLeft+=t*c.settings.wheelSpeed:l.scrollLeft-=h*c.settings.wheelSpeed,r=!0):(l.scrollTop-=h*c.settings.wheelSpeed,l.scrollLeft+=t*c.settings.wheelSpeed),lc(c),r=r||function(a,e){var t=Math.floor(l.scrollTop),h=0===l.scrollTop,r=t+l.offsetHeight===l.scrollHeight,v=0===l.scrollLeft,s=l.scrollLeft+l.offsetWidth===l.scrollWidth;return!(Math.abs(e)>Math.abs(a)?h||r:v||s)||!c.settings.wheelPropagation}(t,h),r&&!a.ctrlKey&&(a.stopPropagation(),a.preventDefault())}}void 0!==window.onwheel?c.event.bind(l,"wheel",a):void 0!==window.onmousewheel&&c.event.bind(l,"mousewheel",a)},touch:function(c){if(cc.supportsTouch||cc.supportsIePointer){var l=c.element,a={},e=0,t={},h=null;cc.supportsTouch?(c.event.bind(l,"touchstart",n),c.event.bind(l,"touchmove",z),c.event.bind(l,"touchend",o)):cc.supportsIePointer&&(window.PointerEvent?(c.event.bind(l,"pointerdown",n),c.event.bind(l,"pointermove",z),c.event.bind(l,"pointerup",o)):window.MSPointerEvent&&(c.event.bind(l,"MSPointerDown",n),c.event.bind(l,"MSPointerMove",z),c.event.bind(l,"MSPointerUp",o)))}function r(a,e){l.scrollTop-=e,l.scrollLeft-=a,lc(c)}function v(c){return c.targetTouches?c.targetTouches[0]:c}function s(c){return!(c.pointerType&&"pen"===c.pointerType&&0===c.buttons||(!c.targetTouches||1!==c.targetTouches.length)&&(!c.pointerType||"mouse"===c.pointerType||c.pointerType===c.MSPOINTER_TYPE_MOUSE))}function n(c){if(s(c)){var l=v(c);a.pageX=l.pageX,a.pageY=l.pageY,e=(new Date).getTime(),null!==h&&clearInterval(h)}}function z(h){if(s(h)){var n=v(h),z={pageX:n.pageX,pageY:n.pageY},o=z.pageX-a.pageX,i=z.pageY-a.pageY;if(function(c,a,e){if(!l.contains(c))return!1;for(var t=c;t&&t!==l;){if(t.classList.contains(_))return!0;var h=k(t);if(e&&h.overflowY.match(/(scroll|auto)/)){var r=t.scrollHeight-t.clientHeight;if(r>0&&(t.scrollTop>0&&e<0||t.scrollTop0))return!0}if(a&&h.overflowX.match(/(scroll|auto)/)){var v=t.scrollWidth-t.clientWidth;if(v>0&&(t.scrollLeft>0&&a<0||t.scrollLeft0))return!0}t=t.parentNode}return!1}(h.target,o,i))return;r(o,i),a=z;var m=(new Date).getTime(),f=m-e;f>0&&(t.x=o/f,t.y=i/f,e=m),function(a,e){var t=Math.floor(l.scrollTop),h=l.scrollLeft,r=Math.abs(a),v=Math.abs(e);if(v>r){if(e<0&&t===c.contentHeight-c.containerHeight||e>0&&0===t)return 0===window.scrollY&&e>0&&cc.isChrome}else if(r>v&&(a<0&&h===c.contentWidth-c.containerWidth||a>0&&0===h))return!0;return!0}(o,i)&&h.preventDefault()}}function o(){c.settings.swipeEasing&&(clearInterval(h),h=setInterval((function(){c.isInitialized?clearInterval(h):t.x||t.y?Math.abs(t.x)<.01&&Math.abs(t.y)<.01?clearInterval(h):c.element?(r(30*t.x,30*t.y),t.x*=.8,t.y*=.8):clearInterval(h):clearInterval(h)}),10))}}},hc=function(c,l){var a=this;if(void 0===l&&(l={}),"string"==typeof c&&(c=document.querySelector(c)),!c||!c.nodeName)throw new Error("no element is specified to initialize PerfectScrollbar");for(var e in this.element=c,c.classList.add("ps"),this.settings={handlers:["click-rail","drag-thumb","keyboard","wheel","touch"],maxScrollbarLength:null,minScrollbarLength:null,scrollingThreshold:1e3,scrollXMarginOffset:0,scrollYMarginOffset:0,suppressScrollX:!1,suppressScrollY:!1,swipeEasing:!0,useBothWheelAxes:!1,wheelPropagation:!0,wheelSpeed:1},l)this.settings[e]=l[e];this.containerWidth=null,this.containerHeight=null,this.contentWidth=null,this.contentHeight=null;var t,h,r=function(){return c.classList.add(q)},v=function(){return c.classList.remove(q)};this.isRtl="rtl"===k(c).direction,!0===this.isRtl&&c.classList.add("ps__rtl"),this.isNegativeScroll=(h=c.scrollLeft,c.scrollLeft=-1,t=c.scrollLeft<0,c.scrollLeft=h,t),this.negativeScrollAdjustment=this.isNegativeScroll?c.scrollWidth-c.clientWidth:0,this.event=new Q,this.ownerDocument=c.ownerDocument||document,this.scrollbarXRail=E(I("x")),c.appendChild(this.scrollbarXRail),this.scrollbarX=E(R("x")),this.scrollbarXRail.appendChild(this.scrollbarX),this.scrollbarX.setAttribute("tabindex",0),this.event.bind(this.scrollbarX,"focus",r),this.event.bind(this.scrollbarX,"blur",v),this.scrollbarXActive=null,this.scrollbarXWidth=null,this.scrollbarXLeft=null;var s=k(this.scrollbarXRail);this.scrollbarXBottom=parseInt(s.bottom,10),isNaN(this.scrollbarXBottom)?(this.isScrollbarXUsingBottom=!1,this.scrollbarXTop=J(s.top)):this.isScrollbarXUsingBottom=!0,this.railBorderXWidth=J(s.borderLeftWidth)+J(s.borderRightWidth),Z(this.scrollbarXRail,{display:"block"}),this.railXMarginWidth=J(s.marginLeft)+J(s.marginRight),Z(this.scrollbarXRail,{display:""}),this.railXWidth=null,this.railXRatio=null,this.scrollbarYRail=E(I("y")),c.appendChild(this.scrollbarYRail),this.scrollbarY=E(R("y")),this.scrollbarYRail.appendChild(this.scrollbarY),this.scrollbarY.setAttribute("tabindex",0),this.event.bind(this.scrollbarY,"focus",r),this.event.bind(this.scrollbarY,"blur",v),this.scrollbarYActive=null,this.scrollbarYHeight=null,this.scrollbarYTop=null;var n=k(this.scrollbarYRail);this.scrollbarYRight=parseInt(n.right,10),isNaN(this.scrollbarYRight)?(this.isScrollbarYUsingRight=!1,this.scrollbarYLeft=J(n.left)):this.isScrollbarYUsingRight=!0,this.scrollbarYOuterWidth=this.isRtl?function(c){var l=k(c);return J(l.width)+J(l.paddingLeft)+J(l.paddingRight)+J(l.borderLeftWidth)+J(l.borderRightWidth)}(this.scrollbarY):null,this.railBorderYWidth=J(n.borderTopWidth)+J(n.borderBottomWidth),Z(this.scrollbarYRail,{display:"block"}),this.railYMarginHeight=J(n.marginTop)+J(n.marginBottom),Z(this.scrollbarYRail,{display:""}),this.railYHeight=null,this.railYRatio=null,this.reach={x:c.scrollLeft<=0?"start":c.scrollLeft>=this.contentWidth-this.containerWidth?"end":null,y:c.scrollTop<=0?"start":c.scrollTop>=this.contentHeight-this.containerHeight?"end":null},this.isAlive=!0,this.settings.handlers.forEach((function(c){return tc[c](a)})),this.lastScrollTop=Math.floor(c.scrollTop),this.lastScrollLeft=c.scrollLeft,this.event.bind(this.element,"scroll",(function(c){return a.onScroll(c)})),lc(this)};hc.prototype.update=function(){this.isAlive&&(this.negativeScrollAdjustment=this.isNegativeScroll?this.element.scrollWidth-this.element.clientWidth:0,Z(this.scrollbarXRail,{display:"block"}),Z(this.scrollbarYRail,{display:"block"}),this.railXMarginWidth=J(k(this.scrollbarXRail).marginLeft)+J(k(this.scrollbarXRail).marginRight),this.railYMarginHeight=J(k(this.scrollbarYRail).marginTop)+J(k(this.scrollbarYRail).marginBottom),Z(this.scrollbarXRail,{display:"none"}),Z(this.scrollbarYRail,{display:"none"}),lc(this),K(this,"top",0,!1,!0),K(this,"left",0,!1,!0),Z(this.scrollbarXRail,{display:""}),Z(this.scrollbarYRail,{display:""}))},hc.prototype.onScroll=function(c){this.isAlive&&(lc(this),K(this,"top",this.element.scrollTop-this.lastScrollTop),K(this,"left",this.element.scrollLeft-this.lastScrollLeft),this.lastScrollTop=Math.floor(this.element.scrollTop),this.lastScrollLeft=this.element.scrollLeft)},hc.prototype.destroy=function(){this.isAlive&&(this.event.unbindAll(),T(this.scrollbarX),T(this.scrollbarY),T(this.scrollbarXRail),T(this.scrollbarYRail),this.removePsClasses(),this.element=null,this.scrollbarX=null,this.scrollbarY=null,this.scrollbarXRail=null,this.scrollbarYRail=null,this.isAlive=!1)},hc.prototype.removePsClasses=function(){this.element.className=this.element.className.split(" ").filter((function(c){return!c.match(/^ps([-_].+|)$/)})).join(" ")};const rc=hc;var vc=function(){function c(l){w(this,c),this.options=y(y({},c.defaultOptions),l),this.activeIndex=this.options.activeIndex,this._initElements(),this._initTabs(),this._bindTabsClick(),this._bindButtonClick(),this._bindWrapperClick(),this.perfectScrollbar()}return x(c,[{key:"_initElements",value:function(){this.$sidebar=$(this.options.sidebar),this.$tabs=$(this.options.tabs),this.$panels=$(this.options.panels),this.$menuButton=$(this.options.menuButton),this.$nav=$(this.options.nav),this.$content=$(this.options.content)}},{key:"_initTabs",value:function(){this.$tabs.each((function(c,l){$(l).data("tabIndex",c)}))}},{key:"activateSidebar",value:function(){this.$sidebar.removeClass("sidebar-hide"),$(".wrapper").addClass("wrapper-sidebar-active"),$("header.header").addClass("header-sidebar-active"),$(".footer-fixed").addClass("footer-fixed-sidebar-active"),$(".toc-wrapper").addClass("toc-slide"),this.$menuButton.addClass("header-sidebar-menu-active"),this.$sidebar.addClass("sidebar-active")}},{key:"_inactivateSidebar",value:function(){$(".wrapper").removeClass("wrapper-sidebar-active"),$("header.header").removeClass("header-sidebar-active"),$(".footer-fixed").removeClass("footer-fixed-sidebar-active"),$(".toc-wrapper").removeClass("toc-slide"),this.$menuButton.removeClass("header-sidebar-menu-active"),this.$sidebar.removeClass("sidebar-active")}},{key:"switchTo",value:function(c){this._switchTo(c)}},{key:"_switchTab",value:function(c){for(var l=0;l<3;l++)l!==c?this.$nav.removeClass("sidebar-tabs-active-".concat(l)):this.$nav.addClass("sidebar-tabs-active-".concat(l))}},{key:"_switchPanel",value:function(c){for(var l=0;l<3;l++)l!==c?this.$content.removeClass("sidebar-content-active-".concat(l)):this.$content.addClass("sidebar-content-active-".concat(l))}},{key:"_switchTo",value:function(c){this._switchTab(c),this._switchPanel(c)}},{key:"_bindTabsClick",value:function(){var c=this;this.$tabs.click((function(l){var a=$(l.target);c.switchTo(a.data("tabIndex"))}))}},{key:"_bindButtonClick",value:function(){var c=this;this.$menuButton.click((function(l){c.$sidebar.hasClass("sidebar-active")?c._inactivateSidebar():c.activateSidebar()}))}},{key:"_bindWrapperClick",value:function(){var c=this;$(".wrapper").click((function(l){c._inactivateSidebar()}))}},{key:"perfectScrollbar",value:function(){new rc(".sidebar",{suppressScrollX:!0})}}]),c}();b(vc,"defaultOptions",{activeIndex:0});const sc=new vc({sidebar:".sidebar",nav:".sidebar-tabs",tabs:".sidebar-tabs li",content:".sidebar-content",panels:".sideabar-contents > div",menuButton:".header-sidebar-menu"});a(6992),a(1532),a(8783),a(3948),a(9653);var nc=a(6729),zc=a.n(nc),oc=function(){function c(l,a,e){w(this,c),this.currLabelName="",this.isInited=!1,this.postsArr=null,this.metaName=l,this.labelsContainer=$(a)[0],this.postContainer=$(e)[0],this.indexMap=new Map,this._bindLabelClick()}return x(c,[{key:"changeLabel",value:function(c){"string"==typeof c&&(this.currLabelName=c,this._changeList(),this._changeFocus())}},{key:"_bindLabelClick",value:function(){var c=this;this.labelsContainer.addEventListener("click",(function(l){var a=l.target.getAttribute("data-".concat(c.metaName));c.changeLabel(a)}))}},{key:"_changeFocus",value:function(c){var l=this;t(this.labelsContainer.getElementsByClassName("sidebar-label-focus")).forEach((function(c){return c.classList.remove("sidebar-label-focus")})),t(this.labelsContainer.children).forEach((function(c){c.getAttribute("data-".concat(l.metaName))===l.currLabelName&&c.classList.add("sidebar-label-focus")}))}},{key:"_changeList",value:function(){var c=this,l=this.indexMap.get(this.currLabelName);try{var a=l.map((function(l){return c.postsArr[l]}));this._createPostsDom(a)}catch(c){console.error("Please ensure set `tags: true` and `categories: true` of the hexo-content-json config")}}},{key:"_createPostsDom",value:function(c){var l=document.createDocumentFragment();this.postContainer.innerHTML="";for(var a=0;a"),a=$(''+c.title+"");return l.append(a),l[0]}},{key:"tryInit",value:function(c){var l=this;if(!this.isInited&&"[object Null]"!==Object.prototype.toString.call(c)){for(var a=function(a){var e=c[a][l.metaName],t="name";e&&e.length&&e.forEach((function(c){l.indexMap.has(c[t])?l.indexMap.get(c[t]).push(a):l.indexMap.set(c[t],[a])}))},e=0;e'+l+""},fc="color: #fff; background: #f75357; padding: 1px; border-radius: 5px;";console.info("%c 🎯 hexo-theme-archer ⬇️ ",fc),console.info("%c 🏷 Version: 1.6.4 ",fc),console.info("%c 📅 Version date: 20210811 ",fc),console.info("%c 📦 https://github.com/fi3ework/hexo-theme-archer ",fc),window.addEventListener("load",(function(c){console.log("All resources finished loading!")})),function(){var c=$(".site-intro-img:first"),a=$(".site-intro-placeholder:first"),e=c.css("background-image").match(/url\("*([^"]*)"*\)/);if(e.length<2)console.error("Error while loading site intro image. Please check image's url."),console.log(e);else{var t=e[1],h=new Image;h.onload=function(){a.remove(),console.info("site intro image loaded.")},h.src=t}document.addEventListener("DOMContentLoaded",(function(){$(".container").removeClass("container-unloaded"),$(".footer").removeClass("footer-unloaded"),$(".loading").remove();var c=window.location.hash;window.location.hash=o(),window.history.replaceState({},"",c);var a=new(l());a.options={placement:"right",class:"anchorjs-archer"},a.add(),L()}),!1)}(),function(){if(window.matchMedia){var c=window.matchMedia("(max-width: 960px)");c.addListener(l),l(c)}else window.addListener("resize",(function(){l((window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth)>900?{matches:!1}:{matches:!0})}),!1);function l(c){c.matches?console.log("mobile"):console.log("desktop")}}(),function(){var c=$(".banner:first"),l=c.find(".post-title a"),a=$(".site-intro:first"),e=$("header.header"),t=$(".header-actions"),h=$(".back-top:first"),v=$(".header-sidebar-menu:first"),s=$(".toc-wrapper:first"),n=s.find(".toc-catalog"),z=$(".read-progress"),o=a.offset().top+a.outerHeight()-e.height()/2;n.on("click",(function(){s.toggleClass("toc-hide-children")}));var f=0,M=0,u=-1,H=!0;function V(c){if(c>o){if(1!==u)return u=1,H=!1,1}else if(-1!==u)return u=-1,H=!0,-1;return 0}var d,C,L=!1;$(".post-body").length&&(L=!0,C=o,d=$(".article-entry").outerHeight(),d=$(".container")[0].addEventListener("transitionend",(function(){d=$(".article-entry").outerHeight()})));var p=!1;function A(l){var a=V(l);if(1===a?(s.addClass("toc-fixed"),e.removeClass("header-mobile"),t.addClass("header-actions-hide"),v.addClass("header-sidebar-menu-black"),h.removeClass("back-top-hidden")):-1===a&&(s.removeClass("toc-fixed"),e.addClass("header-mobile"),t.removeClass("header-actions-hide"),c.removeClass("banner-show"),v.removeClass("header-sidebar-menu-black"),h.addClass("back-top-hidden")),L){if(!window.preventPostPageBannerDefault){var r=(M+=l-f)>30?(M=0,1):M<-200?(M=0,-1):0;1===r?c.removeClass("banner-show"):-1!==r||H||c.addClass("banner-show")}!function(c,l,a){var e,t=$(window).height(),h=(e=(e=c=0?e:100)-100<=0?e-100:0;z[0].style.opacity="1",z[0].style.transform="translate3d(".concat(h,"%, 0, 0)")}(l,C,d)}f=l,p=!1,window.preventPostPageBannerDefault=!1}function b(){var c=$(document).scrollTop(),l=A.bind(null,c);i(p,l)}b();var g=m(b,25,!0);$(document).on("scroll",g),[l,h].forEach((function(c){c.on("click",r)}))}();var Mc=new ic;Mc.addTab({metaName:"tags",labelsContainer:".sidebar-tags-name",postsContainer:".sidebar-tags-list"}),Mc.addTab({metaName:"categories",labelsContainer:".sidebar-categories-name",postsContainer:".sidebar-categories-list"}),document.querySelectorAll(".article-entry img").forEach(mc),document.querySelectorAll(".about-body container img").forEach(mc)})()})(); +//# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/scripts/main.js.LICENSE.txt b/scripts/main.js.LICENSE.txt new file mode 100644 index 000000000..9811696e9 --- /dev/null +++ b/scripts/main.js.LICENSE.txt @@ -0,0 +1,10 @@ +/*! + * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ + +/*! + * perfect-scrollbar v1.5.3 + * Copyright 2021 Hyunje Jun, MDBootstrap and Contributors + * Licensed under MIT + */ diff --git a/scripts/main.js.map b/scripts/main.js.map new file mode 100644 index 000000000..28ad7d9e8 --- /dev/null +++ b/scripts/main.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.js","mappings":"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","sources":["webpack://hexo-theme-archer/./node_modules/@fortawesome/fontawesome-free/js/brands.min.js","webpack://hexo-theme-archer/./node_modules/@fortawesome/fontawesome-free/js/fontawesome.min.js","webpack://hexo-theme-archer/./node_modules/@fortawesome/fontawesome-free/js/solid.min.js","webpack://hexo-theme-archer/./node_modules/anchor-js/anchor.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/a-callable.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/a-possible-prototype.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/add-to-unscopables.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/advance-string-index.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/an-instance.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/an-object.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/array-buffer-non-extensible.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/array-for-each.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/array-includes.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/array-iteration.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/array-method-has-species-support.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/array-method-is-strict.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/array-slice-simple.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/array-species-constructor.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/array-species-create.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/check-correctness-of-iteration.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/classof-raw.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/classof.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/collection-strong.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/collection.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/copy-constructor-properties.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/correct-prototype-getter.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/create-iter-result-object.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/create-non-enumerable-property.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/create-property-descriptor.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/create-property.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/define-built-in-accessor.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/define-built-in.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/define-built-ins.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/define-global-property.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/descriptors.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/document-all.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/document-create-element.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/dom-iterables.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/dom-token-list-prototype.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/engine-user-agent.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/engine-v8-version.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/enum-bug-keys.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/export.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/fails.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/freezing.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/function-apply.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/function-bind-context.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/function-bind-native.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/function-call.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/function-name.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/function-uncurry-this-clause.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/function-uncurry-this.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/get-built-in.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/get-iterator-method.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/get-iterator.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/get-method.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/get-substitution.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/global.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/has-own-property.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/hidden-keys.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/html.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/ie8-dom-define.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/indexed-object.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/inherit-if-required.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/inspect-source.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/internal-metadata.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/internal-state.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/is-array-iterator-method.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/is-array.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/is-callable.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/is-constructor.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/is-forced.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/is-null-or-undefined.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/is-object.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/is-pure.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/is-regexp.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/is-symbol.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/iterate.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/iterator-close.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/iterator-create-constructor.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/iterator-define.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/iterators-core.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/iterators.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/length-of-array-like.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/make-built-in.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/math-trunc.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/number-parse-int.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/object-create.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/object-define-properties.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/object-define-property.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/object-get-own-property-descriptor.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/object-get-own-property-names-external.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/object-get-own-property-names.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/object-get-own-property-symbols.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/object-get-prototype-of.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/object-is-extensible.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/object-is-prototype-of.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/object-keys-internal.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/object-keys.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/object-property-is-enumerable.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/object-set-prototype-of.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/object-to-string.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/ordinary-to-primitive.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/own-keys.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/path.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/proxy-accessor.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/regexp-exec-abstract.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/regexp-exec.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/regexp-flags.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/regexp-get-flags.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/regexp-sticky-helpers.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/regexp-unsupported-dot-all.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/regexp-unsupported-ncg.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/require-object-coercible.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/set-species.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/set-to-string-tag.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/shared-key.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/shared-store.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/shared.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/string-multibyte.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/string-trim.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/symbol-constructor-detection.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/this-number-value.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/to-absolute-index.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/to-indexed-object.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/to-integer-or-infinity.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/to-length.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/to-object.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/to-primitive.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/to-property-key.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/to-string-tag-support.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/to-string.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/try-to-string.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/uid.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/use-symbol-as-uid.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/v8-prototype-define-bug.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/weak-map-basic-detection.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/well-known-symbol.js","webpack://hexo-theme-archer/./node_modules/core-js/internals/whitespaces.js","webpack://hexo-theme-archer/./node_modules/core-js/modules/es.array.find.js","webpack://hexo-theme-archer/./node_modules/core-js/modules/es.array.iterator.js","webpack://hexo-theme-archer/./node_modules/core-js/modules/es.array.map.js","webpack://hexo-theme-archer/./node_modules/core-js/modules/es.map.constructor.js","webpack://hexo-theme-archer/./node_modules/core-js/modules/es.map.js","webpack://hexo-theme-archer/./node_modules/core-js/modules/es.number.constructor.js","webpack://hexo-theme-archer/./node_modules/core-js/modules/es.object.to-string.js","webpack://hexo-theme-archer/./node_modules/core-js/modules/es.parse-int.js","webpack://hexo-theme-archer/./node_modules/core-js/modules/es.regexp.constructor.js","webpack://hexo-theme-archer/./node_modules/core-js/modules/es.regexp.dot-all.js","webpack://hexo-theme-archer/./node_modules/core-js/modules/es.regexp.exec.js","webpack://hexo-theme-archer/./node_modules/core-js/modules/es.regexp.sticky.js","webpack://hexo-theme-archer/./node_modules/core-js/modules/es.regexp.test.js","webpack://hexo-theme-archer/./node_modules/core-js/modules/es.regexp.to-string.js","webpack://hexo-theme-archer/./node_modules/core-js/modules/es.string.iterator.js","webpack://hexo-theme-archer/./node_modules/core-js/modules/es.string.match.js","webpack://hexo-theme-archer/./node_modules/core-js/modules/es.string.replace.js","webpack://hexo-theme-archer/./node_modules/core-js/modules/web.dom-collections.for-each.js","webpack://hexo-theme-archer/./node_modules/core-js/modules/web.dom-collections.iterator.js","webpack://hexo-theme-archer/./node_modules/eventemitter3/index.js","webpack://hexo-theme-archer/webpack/bootstrap","webpack://hexo-theme-archer/webpack/runtime/compat get default export","webpack://hexo-theme-archer/webpack/runtime/define property getters","webpack://hexo-theme-archer/webpack/runtime/global","webpack://hexo-theme-archer/webpack/runtime/hasOwnProperty shorthand","webpack://hexo-theme-archer/./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://hexo-theme-archer/./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://hexo-theme-archer/./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://hexo-theme-archer/./node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://hexo-theme-archer/./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://hexo-theme-archer/./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://hexo-theme-archer/./src/js/util.js","webpack://hexo-theme-archer/./src/js/toc.js","webpack://hexo-theme-archer/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://hexo-theme-archer/./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://hexo-theme-archer/./node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://hexo-theme-archer/./node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://hexo-theme-archer/./node_modules/@babel/runtime/helpers/esm/objectSpread2.js","webpack://hexo-theme-archer/./node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack://hexo-theme-archer/./node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://hexo-theme-archer/./node_modules/perfect-scrollbar/dist/perfect-scrollbar.esm.js","webpack://hexo-theme-archer/./src/js/scroll.js","webpack://hexo-theme-archer/./src/js/sidebar.js","webpack://hexo-theme-archer/./src/js/initSidebar.js","webpack://hexo-theme-archer/./src/js/mobile.js","webpack://hexo-theme-archer/./src/js/tag.js","webpack://hexo-theme-archer/./src/js/fancybox.js","webpack://hexo-theme-archer/./src/js/main.js","webpack://hexo-theme-archer/./src/js/init.js"],"sourcesContent":["/*!\n * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n */\n!function(){\"use strict\";var c={},l={};try{\"undefined\"!=typeof window&&(c=window),\"undefined\"!=typeof document&&(l=document)}catch(c){}var z=(c.navigator||{}).userAgent,h=void 0===z?\"\":z,m=c,v=l,a=(m.document,!!v.documentElement&&!!v.head&&\"function\"==typeof v.addEventListener&&v.createElement,~h.indexOf(\"MSIE\")||h.indexOf(\"Trident/\"),\"___FONT_AWESOME___\"),M=function(){try{return!0}catch(c){return!1}}();var s=m||{};s[a]||(s[a]={}),s[a].styles||(s[a].styles={}),s[a].hooks||(s[a].hooks={}),s[a].shims||(s[a].shims=[]);var H=s[a];function V(c,h){var l=(2>>0;n--;)e[n]=t[n];return e}function Ct(t){return t.classList?At(t.classList):(t.getAttribute(\"class\")||\"\").split(\" \").filter(function(t){return t})}function Ot(t,e){var n,a=e.split(\"-\"),r=a[0],i=a.slice(1).join(\"-\");return r!==t||\"\"===i||(n=i,~H.indexOf(n))?null:i}function Pt(t){return\"\".concat(t).replace(/&/g,\"&\").replace(/\"/g,\""\").replace(/'/g,\"'\").replace(//g,\">\")}function St(n){return Object.keys(n||{}).reduce(function(t,e){return t+\"\".concat(e,\": \").concat(n[e],\";\")},\"\")}function Nt(t){return t.size!==yt.size||t.x!==yt.x||t.y!==yt.y||t.rotate!==yt.rotate||t.flipX||t.flipY}function Mt(t){var e=t.transform,n=t.containerWidth,a=t.iconWidth,r={transform:\"translate(\".concat(n/2,\" 256)\")},i=\"translate(\".concat(32*e.x,\", \").concat(32*e.y,\") \"),o=\"scale(\".concat(e.size/16*(e.flipX?-1:1),\", \").concat(e.size/16*(e.flipY?-1:1),\") \"),c=\"rotate(\".concat(e.rotate,\" 0 0)\");return{outer:r,inner:{transform:\"\".concat(i,\" \").concat(o,\" \").concat(c)},path:{transform:\"translate(\".concat(a/2*-1,\" -256)\")}}}var zt={x:0,y:0,width:\"100%\",height:\"100%\"};function Et(t){var e=!(1\").concat(o.map(Zt).join(\"\"),\"\")}var $t=function(){};function te(t){return\"string\"==typeof(t.getAttribute?t.getAttribute(tt):null)}var ee={replace:function(t){var e=t[0],n=t[1].map(function(t){return Zt(t)}).join(\"\\n\");if(e.parentNode&&e.outerHTML)e.outerHTML=n+(et.keepOriginalSource&&\"svg\"!==e.tagName.toLowerCase()?\"\\x3c!-- \".concat(e.outerHTML,\" Font Awesome fontawesome.com --\\x3e\"):\"\");else if(e.parentNode){var a=document.createElement(\"span\");e.parentNode.replaceChild(a,e),a.outerHTML=n}},nest:function(t){var e=t[0],n=t[1];if(~Ct(e).indexOf(et.replacementClass))return ee.replace(t);var a=new RegExp(\"\".concat(et.familyPrefix,\"-.*\"));delete n[0].attributes.style,delete n[0].attributes.id;var r=n[0].attributes.class.split(\" \").reduce(function(t,e){return e===et.replacementClass||e.match(a)?t.toSvg.push(e):t.toNode.push(e),t},{toNode:[],toSvg:[]});n[0].attributes.class=r.toSvg.join(\" \");var i=n.map(function(t){return Zt(t)}).join(\"\\n\");e.setAttribute(\"class\",r.toNode.join(\" \")),e.setAttribute(tt,\"\"),e.innerHTML=i}};function ne(t){t()}function ae(n,t){var a=\"function\"==typeof t?t:$t;if(0===n.length)a();else{var e=ne;et.mutateApproach===S&&(e=v.requestAnimationFrame||ne),e(function(){var t=!0===et.autoReplaceSvg?ee.replace:ee[et.autoReplaceSvg]||ee.replace,e=Yt.begin(\"mutate\");n.map(t),e(),a()})}}var re=!1;function ie(){re=!1}var oe=null;function ce(t){if(l&&et.observeMutations){var r=t.treeCallback,i=t.nodeCallback,o=t.pseudoElementsCallback,e=t.observeMutationsRoot,n=void 0===e?b:e;oe=new l(function(t){re||At(t).forEach(function(t){if(\"childList\"===t.type&&0li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);transform:scale(1,-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1,-1);transform:scale(-1,-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;position:relative;width:2.5em}.fa-stack-1x,.fa-stack-2x{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.svg-inline--fa.fa-stack-1x{height:1em;width:1.25em}.svg-inline--fa.fa-stack-2x{height:2em;width:2.5em}.fa-inverse{color:#fff}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.svg-inline--fa .fa-primary{fill:var(--fa-primary-color,currentColor);opacity:1;opacity:var(--fa-primary-opacity,1)}.svg-inline--fa .fa-secondary{fill:var(--fa-secondary-color,currentColor);opacity:.4;opacity:var(--fa-secondary-opacity,.4)}.svg-inline--fa.fa-swap-opacity .fa-primary{opacity:.4;opacity:var(--fa-secondary-opacity,.4)}.svg-inline--fa.fa-swap-opacity .fa-secondary{opacity:1;opacity:var(--fa-primary-opacity,1)}.svg-inline--fa mask .fa-primary,.svg-inline--fa mask .fa-secondary{fill:#000}.fad.fa-inverse{color:#fff}\";function Me(){var t=g,e=y,n=et.familyPrefix,a=et.replacementClass,r=Ne;if(n!==t||a!==e){var i=new RegExp(\"\\\\.\".concat(t,\"\\\\-\"),\"g\"),o=new RegExp(\"\\\\--\".concat(t,\"\\\\-\"),\"g\"),c=new RegExp(\"\\\\.\".concat(e),\"g\");r=r.replace(i,\".\".concat(n,\"-\")).replace(o,\"--\".concat(n,\"-\")).replace(c,\".\".concat(a))}return r}function ze(){et.autoAddCss&&!Ie&&(wt(Me()),Ie=!0)}function Ee(e,t){return Object.defineProperty(e,\"abstract\",{get:t}),Object.defineProperty(e,\"html\",{get:function(){return e.abstract.map(function(t){return Zt(t)})}}),Object.defineProperty(e,\"node\",{get:function(){if(m){var t=b.createElement(\"div\");return t.innerHTML=e.html,t.children}}}),e}function je(t){var e=t.prefix,n=void 0===e?\"fa\":e,a=t.iconName;if(a)return Qt(Re.definitions,n,a)||Qt(W.styles,n,a)}var Le,Re=new(function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}(this,t),this.definitions={}}var e,n,a;return e=t,(n=[{key:\"add\",value:function(){for(var e=this,t=arguments.length,n=new Array(t),a=0;a\n // ;`\n anchor = document.createElement('a');\n anchor.className = 'anchorjs-link ' + this.options.class;\n anchor.setAttribute('aria-label', this.options.ariaLabel);\n anchor.setAttribute('data-anchorjs-icon', this.options.icon);\n if (this.options.titleText) {\n anchor.title = this.options.titleText;\n }\n\n // Adjust the href if there's a tag. See https://github.com/bryanbraun/anchorjs/issues/98\n hrefBase = document.querySelector('base') ? window.location.pathname + window.location.search : '';\n hrefBase = this.options.base || hrefBase;\n anchor.href = hrefBase + '#' + elementID;\n\n if (visibleOptionToUse === 'always') {\n anchor.style.opacity = '1';\n }\n\n if (this.options.icon === '\\uE9CB') {\n anchor.style.font = '1em/1 anchorjs-icons';\n\n // We set lineHeight = 1 here because the `anchorjs-icons` font family could otherwise affect the\n // height of the heading. This isn't the case for icons with `placement: left`, so we restore\n // line-height: inherit in that case, ensuring they remain positioned correctly. For more info,\n // see https://github.com/bryanbraun/anchorjs/issues/39.\n if (this.options.placement === 'left') {\n anchor.style.lineHeight = 'inherit';\n }\n }\n\n if (this.options.placement === 'left') {\n anchor.style.position = 'absolute';\n anchor.style.marginLeft = '-1em';\n anchor.style.paddingRight = '.5em';\n elements[i].insertBefore(anchor, elements[i].firstChild);\n } else { // if the option provided is `right` (or anything else).\n anchor.style.paddingLeft = '.375em';\n elements[i].appendChild(anchor);\n }\n }\n\n for (i = 0; i < indexesToDrop.length; i++) {\n elements.splice(indexesToDrop[i] - i, 1);\n }\n\n this.elements = this.elements.concat(elements);\n\n return this;\n };\n\n /**\n * Removes all anchorjs-links from elements targeted by the selector.\n * @param {String|Array|Nodelist} selector - A CSS selector string targeting elements with anchor links,\n * OR a nodeList / array containing the DOM elements.\n * @return {this} - The AnchorJS object\n */\n this.remove = function(selector) {\n var index,\n domAnchor,\n elements = _getElements(selector);\n\n for (var i = 0; i < elements.length; i++) {\n domAnchor = elements[i].querySelector('.anchorjs-link');\n if (domAnchor) {\n // Drop the element from our main list, if it's in there.\n index = this.elements.indexOf(elements[i]);\n if (index !== -1) {\n this.elements.splice(index, 1);\n }\n\n // Remove the anchor from the DOM.\n elements[i].removeChild(domAnchor);\n }\n }\n\n return this;\n };\n\n /**\n * Removes all anchorjs links. Mostly used for tests.\n */\n this.removeAll = function() {\n this.remove(this.elements);\n };\n\n /**\n * Urlify - Refine text so it makes a good ID.\n *\n * To do this, we remove apostrophes, replace non-safe characters with hyphens,\n * remove extra hyphens, truncate, trim hyphens, and make lowercase.\n *\n * @param {String} text - Any text. Usually pulled from the webpage element we are linking to.\n * @return {String} - hyphen-delimited text for use in IDs and URLs.\n */\n this.urlify = function(text) {\n // Decode HTML characters such as ' ' first.\n var textareaElement = document.createElement('textarea');\n textareaElement.innerHTML = text;\n text = textareaElement.value;\n\n // Regex for finding the non-safe URL characters (many need escaping):\n // & +$,:;=?@\"#{}|^~[`%!'<>]./()*\\ (newlines, tabs, backspace, vertical tabs, and non-breaking space)\n var nonsafeChars = /[& +$,:;=?@\"#{}|^~[`%!'<>\\]./()*\\\\\\n\\t\\b\\v\\u00A0]/g;\n\n // The reason we include this _applyRemainingDefaultOptions is so urlify can be called independently,\n // even after setting options. This can be useful for tests or other applications.\n if (!this.options.truncate) {\n _applyRemainingDefaultOptions(this.options);\n }\n\n // Note: we trim hyphens after truncating because truncating can cause dangling hyphens.\n // Example string: // \" ⚡⚡ Don't forget: URL fragments should be i18n-friendly, hyphenated, short, and clean.\"\n return text.trim() // \"⚡⚡ Don't forget: URL fragments should be i18n-friendly, hyphenated, short, and clean.\"\n .replace(/'/gi, '') // \"⚡⚡ Dont forget: URL fragments should be i18n-friendly, hyphenated, short, and clean.\"\n .replace(nonsafeChars, '-') // \"⚡⚡-Dont-forget--URL-fragments-should-be-i18n-friendly--hyphenated--short--and-clean-\"\n .replace(/-{2,}/g, '-') // \"⚡⚡-Dont-forget-URL-fragments-should-be-i18n-friendly-hyphenated-short-and-clean-\"\n .substring(0, this.options.truncate) // \"⚡⚡-Dont-forget-URL-fragments-should-be-i18n-friendly-hyphenated-\"\n .replace(/^-+|-+$/gm, '') // \"⚡⚡-Dont-forget-URL-fragments-should-be-i18n-friendly-hyphenated\"\n .toLowerCase(); // \"⚡⚡-dont-forget-url-fragments-should-be-i18n-friendly-hyphenated\"\n };\n\n /**\n * Determines if this element already has an AnchorJS link on it.\n * Uses this technique: https://stackoverflow.com/a/5898748/1154642\n * @param {HTMLElement} el - a DOM node\n * @return {Boolean} true/false\n */\n this.hasAnchorJSLink = function(el) {\n var hasLeftAnchor = el.firstChild && (' ' + el.firstChild.className + ' ').indexOf(' anchorjs-link ') > -1,\n hasRightAnchor = el.lastChild && (' ' + el.lastChild.className + ' ').indexOf(' anchorjs-link ') > -1;\n\n return hasLeftAnchor || hasRightAnchor || false;\n };\n\n /**\n * Turns a selector, nodeList, or array of elements into an array of elements (so we can use array methods).\n * It also throws errors on any other inputs. Used to handle inputs to .add and .remove.\n * @param {String|Array|Nodelist} input - A CSS selector string targeting elements with anchor links,\n * OR a nodeList / array containing the DOM elements.\n * @return {Array} - An array containing the elements we want.\n */\n function _getElements(input) {\n var elements;\n if (typeof input === 'string' || input instanceof String) {\n // See https://davidwalsh.name/nodelist-array for the technique transforming nodeList -> Array.\n elements = [].slice.call(document.querySelectorAll(input));\n // I checked the 'input instanceof NodeList' test in IE9 and modern browsers and it worked for me.\n } else if (Array.isArray(input) || input instanceof NodeList) {\n elements = [].slice.call(input);\n } else {\n throw new TypeError('The selector provided to AnchorJS was invalid.');\n }\n\n return elements;\n }\n\n /**\n * _addBaselineStyles\n * Adds baseline styles to the page, used by all AnchorJS links irregardless of configuration.\n */\n function _addBaselineStyles() {\n // We don't want to add global baseline styles if they've been added before.\n if (document.head.querySelector('style.anchorjs') !== null) {\n return;\n }\n\n var style = document.createElement('style'),\n linkRule =\n '.anchorjs-link{' +\n 'opacity:0;' +\n 'text-decoration:none;' +\n '-webkit-font-smoothing:antialiased;' +\n '-moz-osx-font-smoothing:grayscale' +\n '}',\n hoverRule =\n ':hover>.anchorjs-link,' +\n '.anchorjs-link:focus{' +\n 'opacity:1' +\n '}',\n anchorjsLinkFontFace =\n '@font-face{' +\n 'font-family:anchorjs-icons;' + // Icon from icomoon; 10px wide & 10px tall; 2 empty below & 4 above\n 'src:url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format(\"truetype\")' +\n '}',\n pseudoElContent =\n '[data-anchorjs-icon]::after{' +\n 'content:attr(data-anchorjs-icon)' +\n '}',\n firstStyleEl;\n\n style.className = 'anchorjs';\n style.appendChild(document.createTextNode('')); // Necessary for Webkit.\n\n // We place it in the head with the other style tags, if possible, so as to\n // not look out of place. We insert before the others so these styles can be\n // overridden if necessary.\n firstStyleEl = document.head.querySelector('[rel=\"stylesheet\"],style');\n if (firstStyleEl === undefined) {\n document.head.appendChild(style);\n } else {\n document.head.insertBefore(style, firstStyleEl);\n }\n\n style.sheet.insertRule(linkRule, style.sheet.cssRules.length);\n style.sheet.insertRule(hoverRule, style.sheet.cssRules.length);\n style.sheet.insertRule(pseudoElContent, style.sheet.cssRules.length);\n style.sheet.insertRule(anchorjsLinkFontFace, style.sheet.cssRules.length);\n }\n }\n\n return AnchorJS;\n}));\n","var isCallable = require('../internals/is-callable');\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\n// `Assert: IsCallable(argument) is true`\nmodule.exports = function (argument) {\n if (isCallable(argument)) return argument;\n throw $TypeError(tryToString(argument) + ' is not a function');\n};\n","var isCallable = require('../internals/is-callable');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument) {\n if (typeof argument == 'object' || isCallable(argument)) return argument;\n throw $TypeError(\"Can't set \" + $String(argument) + ' as a prototype');\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar defineProperty = require('../internals/object-define-property').f;\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n defineProperty(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.es/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? charAt(S, index).length : 1);\n};\n","var isPrototypeOf = require('../internals/object-is-prototype-of');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (it, Prototype) {\n if (isPrototypeOf(Prototype, it)) return it;\n throw $TypeError('Incorrect invocation');\n};\n","var isObject = require('../internals/is-object');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\n// `Assert: Type(argument) is Object`\nmodule.exports = function (argument) {\n if (isObject(argument)) return argument;\n throw $TypeError($String(argument) + ' is not an object');\n};\n","// FF26- bug: ArrayBuffers are non-extensible, but Object.isExtensible does not report it\nvar fails = require('../internals/fails');\n\nmodule.exports = fails(function () {\n if (typeof ArrayBuffer == 'function') {\n var buffer = new ArrayBuffer(8);\n // eslint-disable-next-line es/no-object-isextensible, es/no-object-defineproperty -- safe\n if (Object.isExtensible(buffer)) Object.defineProperty(buffer, 'a', { value: 8 });\n }\n});\n","'use strict';\nvar $forEach = require('../internals/array-iteration').forEach;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.foreach\nmodule.exports = !STRICT_METHOD ? function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n// eslint-disable-next-line es/no-array-prototype-foreach -- safe\n} : [].forEach;\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = lengthOfArrayLike(O);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare -- NaN check\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare -- NaN check\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.es/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.es/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","var bind = require('../internals/function-bind-context');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar IndexedObject = require('../internals/indexed-object');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\nvar push = uncurryThis([].push);\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation\nvar createMethod = function (TYPE) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var IS_FILTER_REJECT = TYPE == 7;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var boundFunction = bind(callbackfn, that);\n var length = lengthOfArrayLike(self);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push(target, value); // filter\n } else switch (TYPE) {\n case 4: return false; // every\n case 7: push(target, value); // filterReject\n }\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.forEach` method\n // https://tc39.es/ecma262/#sec-array.prototype.foreach\n forEach: createMethod(0),\n // `Array.prototype.map` method\n // https://tc39.es/ecma262/#sec-array.prototype.map\n map: createMethod(1),\n // `Array.prototype.filter` method\n // https://tc39.es/ecma262/#sec-array.prototype.filter\n filter: createMethod(2),\n // `Array.prototype.some` method\n // https://tc39.es/ecma262/#sec-array.prototype.some\n some: createMethod(3),\n // `Array.prototype.every` method\n // https://tc39.es/ecma262/#sec-array.prototype.every\n every: createMethod(4),\n // `Array.prototype.find` method\n // https://tc39.es/ecma262/#sec-array.prototype.find\n find: createMethod(5),\n // `Array.prototype.findIndex` method\n // https://tc39.es/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod(6),\n // `Array.prototype.filterReject` method\n // https://github.com/tc39/proposal-array-filtering\n filterReject: createMethod(7)\n};\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return V8_VERSION >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call -- required for testing\n method.call(null, argument || function () { return 1; }, 1);\n });\n};\n","var toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar createProperty = require('../internals/create-property');\n\nvar $Array = Array;\nvar max = Math.max;\n\nmodule.exports = function (O, start, end) {\n var length = lengthOfArrayLike(O);\n var k = toAbsoluteIndex(start, length);\n var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n var result = $Array(max(fin - k, 0));\n for (var n = 0; k < fin; k++, n++) createProperty(result, n, O[k]);\n result.length = n;\n return result;\n};\n","var isArray = require('../internals/is-array');\nvar isConstructor = require('../internals/is-constructor');\nvar isObject = require('../internals/is-object');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\nvar $Array = Array;\n\n// a part of `ArraySpeciesCreate` abstract operation\n// https://tc39.es/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (isConstructor(C) && (C === $Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? $Array : C;\n};\n","var arraySpeciesConstructor = require('../internals/array-species-constructor');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.es/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length);\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nvar toString = uncurryThis({}.toString);\nvar stringSlice = uncurryThis(''.slice);\n\nmodule.exports = function (it) {\n return stringSlice(toString(it), 8, -1);\n};\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar isCallable = require('../internals/is-callable');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar $Object = Object;\n\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n","'use strict';\nvar defineProperty = require('../internals/object-define-property').f;\nvar create = require('../internals/object-create');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar bind = require('../internals/function-bind-context');\nvar anInstance = require('../internals/an-instance');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar iterate = require('../internals/iterate');\nvar defineIterator = require('../internals/iterator-define');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar setSpecies = require('../internals/set-species');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fastKey = require('../internals/internal-metadata').fastKey;\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\n\nmodule.exports = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var Constructor = wrapper(function (that, iterable) {\n anInstance(that, Prototype);\n setInternalState(that, {\n type: CONSTRUCTOR_NAME,\n index: create(null),\n first: undefined,\n last: undefined,\n size: 0\n });\n if (!DESCRIPTORS) that.size = 0;\n if (!isNullOrUndefined(iterable)) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n });\n\n var Prototype = Constructor.prototype;\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var entry = getEntry(that, key);\n var previous, index;\n // change existing entry\n if (entry) {\n entry.value = value;\n // create new entry\n } else {\n state.last = entry = {\n index: index = fastKey(key, true),\n key: key,\n value: value,\n previous: previous = state.last,\n next: undefined,\n removed: false\n };\n if (!state.first) state.first = entry;\n if (previous) previous.next = entry;\n if (DESCRIPTORS) state.size++;\n else that.size++;\n // add to index\n if (index !== 'F') state.index[index] = entry;\n } return that;\n };\n\n var getEntry = function (that, key) {\n var state = getInternalState(that);\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return state.index[index];\n // frozen object case\n for (entry = state.first; entry; entry = entry.next) {\n if (entry.key == key) return entry;\n }\n };\n\n defineBuiltIns(Prototype, {\n // `{ Map, Set }.prototype.clear()` methods\n // https://tc39.es/ecma262/#sec-map.prototype.clear\n // https://tc39.es/ecma262/#sec-set.prototype.clear\n clear: function clear() {\n var that = this;\n var state = getInternalState(that);\n var data = state.index;\n var entry = state.first;\n while (entry) {\n entry.removed = true;\n if (entry.previous) entry.previous = entry.previous.next = undefined;\n delete data[entry.index];\n entry = entry.next;\n }\n state.first = state.last = undefined;\n if (DESCRIPTORS) state.size = 0;\n else that.size = 0;\n },\n // `{ Map, Set }.prototype.delete(key)` methods\n // https://tc39.es/ecma262/#sec-map.prototype.delete\n // https://tc39.es/ecma262/#sec-set.prototype.delete\n 'delete': function (key) {\n var that = this;\n var state = getInternalState(that);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.next;\n var prev = entry.previous;\n delete state.index[entry.index];\n entry.removed = true;\n if (prev) prev.next = next;\n if (next) next.previous = prev;\n if (state.first == entry) state.first = next;\n if (state.last == entry) state.last = prev;\n if (DESCRIPTORS) state.size--;\n else that.size--;\n } return !!entry;\n },\n // `{ Map, Set }.prototype.forEach(callbackfn, thisArg = undefined)` methods\n // https://tc39.es/ecma262/#sec-map.prototype.foreach\n // https://tc39.es/ecma262/#sec-set.prototype.foreach\n forEach: function forEach(callbackfn /* , that = undefined */) {\n var state = getInternalState(this);\n var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var entry;\n while (entry = entry ? entry.next : state.first) {\n boundFunction(entry.value, entry.key, this);\n // revert to the last existing entry\n while (entry && entry.removed) entry = entry.previous;\n }\n },\n // `{ Map, Set}.prototype.has(key)` methods\n // https://tc39.es/ecma262/#sec-map.prototype.has\n // https://tc39.es/ecma262/#sec-set.prototype.has\n has: function has(key) {\n return !!getEntry(this, key);\n }\n });\n\n defineBuiltIns(Prototype, IS_MAP ? {\n // `Map.prototype.get(key)` method\n // https://tc39.es/ecma262/#sec-map.prototype.get\n get: function get(key) {\n var entry = getEntry(this, key);\n return entry && entry.value;\n },\n // `Map.prototype.set(key, value)` method\n // https://tc39.es/ecma262/#sec-map.prototype.set\n set: function set(key, value) {\n return define(this, key === 0 ? 0 : key, value);\n }\n } : {\n // `Set.prototype.add(value)` method\n // https://tc39.es/ecma262/#sec-set.prototype.add\n add: function add(value) {\n return define(this, value = value === 0 ? 0 : value, value);\n }\n });\n if (DESCRIPTORS) defineProperty(Prototype, 'size', {\n get: function () {\n return getInternalState(this).size;\n }\n });\n return Constructor;\n },\n setStrong: function (Constructor, CONSTRUCTOR_NAME, IS_MAP) {\n var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator';\n var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME);\n var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME);\n // `{ Map, Set }.prototype.{ keys, values, entries, @@iterator }()` methods\n // https://tc39.es/ecma262/#sec-map.prototype.entries\n // https://tc39.es/ecma262/#sec-map.prototype.keys\n // https://tc39.es/ecma262/#sec-map.prototype.values\n // https://tc39.es/ecma262/#sec-map.prototype-@@iterator\n // https://tc39.es/ecma262/#sec-set.prototype.entries\n // https://tc39.es/ecma262/#sec-set.prototype.keys\n // https://tc39.es/ecma262/#sec-set.prototype.values\n // https://tc39.es/ecma262/#sec-set.prototype-@@iterator\n defineIterator(Constructor, CONSTRUCTOR_NAME, function (iterated, kind) {\n setInternalState(this, {\n type: ITERATOR_NAME,\n target: iterated,\n state: getInternalCollectionState(iterated),\n kind: kind,\n last: undefined\n });\n }, function () {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var entry = state.last;\n // revert to the last existing entry\n while (entry && entry.removed) entry = entry.previous;\n // get next entry\n if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) {\n // or finish the iteration\n state.target = undefined;\n return createIterResultObject(undefined, true);\n }\n // return step by kind\n if (kind == 'keys') return createIterResultObject(entry.key, false);\n if (kind == 'values') return createIterResultObject(entry.value, false);\n return createIterResultObject([entry.key, entry.value], false);\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // `{ Map, Set }.prototype[@@species]` accessors\n // https://tc39.es/ecma262/#sec-get-map-@@species\n // https://tc39.es/ecma262/#sec-get-set-@@species\n setSpecies(CONSTRUCTOR_NAME);\n }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isForced = require('../internals/is-forced');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar iterate = require('../internals/iterate');\nvar anInstance = require('../internals/an-instance');\nvar isCallable = require('../internals/is-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar isObject = require('../internals/is-object');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nmodule.exports = function (CONSTRUCTOR_NAME, wrapper, common) {\n var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n var ADDER = IS_MAP ? 'set' : 'add';\n var NativeConstructor = global[CONSTRUCTOR_NAME];\n var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n var Constructor = NativeConstructor;\n var exported = {};\n\n var fixMethod = function (KEY) {\n var uncurriedNativeMethod = uncurryThis(NativePrototype[KEY]);\n defineBuiltIn(NativePrototype, KEY,\n KEY == 'add' ? function add(value) {\n uncurriedNativeMethod(this, value === 0 ? 0 : value);\n return this;\n } : KEY == 'delete' ? function (key) {\n return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n } : KEY == 'get' ? function get(key) {\n return IS_WEAK && !isObject(key) ? undefined : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n } : KEY == 'has' ? function has(key) {\n return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key);\n } : function set(key, value) {\n uncurriedNativeMethod(this, key === 0 ? 0 : key, value);\n return this;\n }\n );\n };\n\n var REPLACE = isForced(\n CONSTRUCTOR_NAME,\n !isCallable(NativeConstructor) || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n new NativeConstructor().entries().next();\n }))\n );\n\n if (REPLACE) {\n // create collection constructor\n Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n InternalMetadataModule.enable();\n } else if (isForced(CONSTRUCTOR_NAME, true)) {\n var instance = new Constructor();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n // eslint-disable-next-line no-new -- required for testing\n var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new NativeConstructor();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n\n if (!ACCEPT_ITERABLES) {\n Constructor = wrapper(function (dummy, iterable) {\n anInstance(dummy, NativePrototype);\n var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n if (!isNullOrUndefined(iterable)) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n return that;\n });\n Constructor.prototype = NativePrototype;\n NativePrototype.constructor = Constructor;\n }\n\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n // weak collections should not contains .clear method\n if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n }\n\n exported[CONSTRUCTOR_NAME] = Constructor;\n $({ global: true, constructor: true, forced: Constructor != NativeConstructor }, exported);\n\n setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n return Constructor;\n};\n","var hasOwn = require('../internals/has-own-property');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source, exceptions) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {\n defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n }\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n // eslint-disable-next-line es/no-object-getprototypeof -- required for testing\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","// `CreateIterResultObject` abstract operation\n// https://tc39.es/ecma262/#sec-createiterresultobject\nmodule.exports = function (value, done) {\n return { value: value, done: done };\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","'use strict';\nvar toPropertyKey = require('../internals/to-property-key');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPropertyKey(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n","var makeBuiltIn = require('../internals/make-built-in');\nvar defineProperty = require('../internals/object-define-property');\n\nmodule.exports = function (target, name, descriptor) {\n if (descriptor.get) makeBuiltIn(descriptor.get, name, { getter: true });\n if (descriptor.set) makeBuiltIn(descriptor.set, name, { setter: true });\n return defineProperty.f(target, name, descriptor);\n};\n","var isCallable = require('../internals/is-callable');\nvar definePropertyModule = require('../internals/object-define-property');\nvar makeBuiltIn = require('../internals/make-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nmodule.exports = function (O, key, value, options) {\n if (!options) options = {};\n var simple = options.enumerable;\n var name = options.name !== undefined ? options.name : key;\n if (isCallable(value)) makeBuiltIn(value, name, options);\n if (options.global) {\n if (simple) O[key] = value;\n else defineGlobalProperty(key, value);\n } else {\n try {\n if (!options.unsafe) delete O[key];\n else if (O[key]) simple = true;\n } catch (error) { /* empty */ }\n if (simple) O[key] = value;\n else definePropertyModule.f(O, key, {\n value: value,\n enumerable: false,\n configurable: !options.nonConfigurable,\n writable: !options.nonWritable\n });\n } return O;\n};\n","var defineBuiltIn = require('../internals/define-built-in');\n\nmodule.exports = function (target, src, options) {\n for (var key in src) defineBuiltIn(target, key, src[key], options);\n return target;\n};\n","var global = require('../internals/global');\n\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nmodule.exports = function (key, value) {\n try {\n defineProperty(global, key, { value: value, configurable: true, writable: true });\n } catch (error) {\n global[key] = value;\n } return value;\n};\n","var fails = require('../internals/fails');\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n","var documentAll = typeof document == 'object' && document.all;\n\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot\n// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing\nvar IS_HTMLDDA = typeof documentAll == 'undefined' && documentAll !== undefined;\n\nmodule.exports = {\n all: documentAll,\n IS_HTMLDDA: IS_HTMLDDA\n};\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n","// in old WebKit versions, `element.classList` is not an instance of global `DOMTokenList`\nvar documentCreateElement = require('../internals/document-create-element');\n\nvar classList = documentCreateElement('span').classList;\nvar DOMTokenListPrototype = classList && classList.constructor && classList.constructor.prototype;\n\nmodule.exports = DOMTokenListPrototype === Object.prototype ? undefined : DOMTokenListPrototype;\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n","var global = require('../internals/global');\nvar userAgent = require('../internals/engine-user-agent');\n\nvar process = global.process;\nvar Deno = global.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n // in old Chrome, versions of V8 isn't V8 = Chrome / 10\n // but their correct versions are not interesting for us\n version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);\n}\n\n// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`\n// so check `userAgent` even if `.v8` exists, but 0\nif (!version && userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = +match[1];\n }\n}\n\nmodule.exports = version;\n","// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.dontCallGetSet - prevent calling a getter on target\n options.name - the .name of the function if it does not match the key\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || defineGlobalProperty(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.dontCallGetSet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty == typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n defineBuiltIn(target, key, sourceProperty, options);\n }\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","'use strict';\n// TODO: Remove from `core-js@4` since it's moved to entry points\nrequire('../modules/es.regexp.exec');\nvar uncurryThis = require('../internals/function-uncurry-this-clause');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar regexpExec = require('../internals/regexp-exec');\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nvar SPECIES = wellKnownSymbol('species');\nvar RegExpPrototype = RegExp.prototype;\n\nmodule.exports = function (KEY, exec, FORCED, SHAM) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n\n if (KEY === 'split') {\n // We can't use real regex here since it causes deoptimization\n // and serious performance degradation in V8\n // https://github.com/zloirock/core-js/issues/306\n re = {};\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n re.flags = '';\n re[SYMBOL] = /./[SYMBOL];\n }\n\n re.exec = function () { execCalled = true; return null; };\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n FORCED\n ) {\n var uncurriedNativeRegExpMethod = uncurryThis(/./[SYMBOL]);\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n var uncurriedNativeMethod = uncurryThis(nativeMethod);\n var $exec = regexp.exec;\n if ($exec === regexpExec || $exec === RegExpPrototype.exec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: uncurriedNativeRegExpMethod(regexp, str, arg2) };\n }\n return { done: true, value: uncurriedNativeMethod(str, regexp, arg2) };\n }\n return { done: false };\n });\n\n defineBuiltIn(String.prototype, KEY, methods[0]);\n defineBuiltIn(RegExpPrototype, SYMBOL, methods[1]);\n }\n\n if (SHAM) createNonEnumerableProperty(RegExpPrototype[SYMBOL], 'sham', true);\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-isextensible, es/no-object-preventextensions -- required for testing\n return Object.isExtensible(Object.preventExtensions({}));\n});\n","var NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar apply = FunctionPrototype.apply;\nvar call = FunctionPrototype.call;\n\n// eslint-disable-next-line es/no-reflect -- safe\nmodule.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () {\n return call.apply(apply, arguments);\n});\n","var uncurryThis = require('../internals/function-uncurry-this-clause');\nvar aCallable = require('../internals/a-callable');\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar bind = uncurryThis(uncurryThis.bind);\n\n// optional / simple context binding\nmodule.exports = function (fn, that) {\n aCallable(fn);\n return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-function-prototype-bind -- safe\n var test = (function () { /* empty */ }).bind();\n // eslint-disable-next-line no-prototype-builtins -- safe\n return typeof test != 'function' || test.hasOwnProperty('prototype');\n});\n","var NATIVE_BIND = require('../internals/function-bind-native');\n\nvar call = Function.prototype.call;\n\nmodule.exports = NATIVE_BIND ? call.bind(call) : function () {\n return call.apply(call, arguments);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar hasOwn = require('../internals/has-own-property');\n\nvar FunctionPrototype = Function.prototype;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\n\nvar EXISTS = hasOwn(FunctionPrototype, 'name');\n// additional protection from minified / mangled / dropped function names\nvar PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));\n\nmodule.exports = {\n EXISTS: EXISTS,\n PROPER: PROPER,\n CONFIGURABLE: CONFIGURABLE\n};\n","var classofRaw = require('../internals/classof-raw');\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = function (fn) {\n // Nashorn bug:\n // https://github.com/zloirock/core-js/issues/1128\n // https://github.com/zloirock/core-js/issues/1130\n if (classofRaw(fn) === 'Function') return uncurryThis(fn);\n};\n","var NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar call = FunctionPrototype.call;\nvar uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call);\n\nmodule.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) {\n return function () {\n return call.apply(fn, arguments);\n };\n};\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\n\nvar aFunction = function (argument) {\n return isCallable(argument) ? argument : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method];\n};\n","var classof = require('../internals/classof');\nvar getMethod = require('../internals/get-method');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (!isNullOrUndefined(it)) return getMethod(it, ITERATOR)\n || getMethod(it, '@@iterator')\n || Iterators[classof(it)];\n};\n","var call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument, usingIterator) {\n var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator;\n if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument));\n throw $TypeError(tryToString(argument) + ' is not iterable');\n};\n","var aCallable = require('../internals/a-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\n// `GetMethod` abstract operation\n// https://tc39.es/ecma262/#sec-getmethod\nmodule.exports = function (V, P) {\n var func = V[P];\n return isNullOrUndefined(func) ? undefined : aCallable(func);\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar floor = Math.floor;\nvar charAt = uncurryThis(''.charAt);\nvar replace = uncurryThis(''.replace);\nvar stringSlice = uncurryThis(''.slice);\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d{1,2}|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d{1,2})/g;\n\n// `GetSubstitution` abstract operation\n// https://tc39.es/ecma262/#sec-getsubstitution\nmodule.exports = function (matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return replace(replacement, symbols, function (match, ch) {\n var capture;\n switch (charAt(ch, 0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return stringSlice(str, 0, position);\n case \"'\": return stringSlice(str, tailPos);\n case '<':\n capture = namedCaptures[stringSlice(ch, 1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? charAt(ch, 1) : captures[f - 1] + charAt(ch, 1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n};\n","var check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line es/no-global-this -- safe\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n // eslint-disable-next-line no-restricted-globals -- safe\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n // eslint-disable-next-line no-new-func -- fallback\n (function () { return this; })() || Function('return this')();\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar hasOwnProperty = uncurryThis({}.hasOwnProperty);\n\n// `HasOwnProperty` abstract operation\n// https://tc39.es/ecma262/#sec-hasownproperty\n// eslint-disable-next-line es/no-object-hasown -- safe\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n return hasOwnProperty(toObject(it), key);\n};\n","module.exports = {};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thanks to IE8 for its funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar $Object = Object;\nvar split = uncurryThis(''.split);\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins -- safe\n return !$Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split(it, '') : $Object(it);\n} : $Object;\n","var isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n setPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n isCallable(NewTarget = dummy.constructor) &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar isCallable = require('../internals/is-callable');\nvar store = require('../internals/shared-store');\n\nvar functionToString = uncurryThis(Function.toString);\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (!isCallable(store.inspectSource)) {\n store.inspectSource = function (it) {\n return functionToString(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","var $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar isObject = require('../internals/is-object');\nvar hasOwn = require('../internals/has-own-property');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertyNamesExternalModule = require('../internals/object-get-own-property-names-external');\nvar isExtensible = require('../internals/object-is-extensible');\nvar uid = require('../internals/uid');\nvar FREEZING = require('../internals/freezing');\n\nvar REQUIRED = false;\nvar METADATA = uid('meta');\nvar id = 0;\n\nvar setMetadata = function (it) {\n defineProperty(it, METADATA, { value: {\n objectID: 'O' + id++, // object ID\n weakData: {} // weak collections IDs\n } });\n};\n\nvar fastKey = function (it, create) {\n // return a primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!hasOwn(it, METADATA)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMetadata(it);\n // return object ID\n } return it[METADATA].objectID;\n};\n\nvar getWeakData = function (it, create) {\n if (!hasOwn(it, METADATA)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMetadata(it);\n // return the store of weak collections IDs\n } return it[METADATA].weakData;\n};\n\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZING && REQUIRED && isExtensible(it) && !hasOwn(it, METADATA)) setMetadata(it);\n return it;\n};\n\nvar enable = function () {\n meta.enable = function () { /* empty */ };\n REQUIRED = true;\n var getOwnPropertyNames = getOwnPropertyNamesModule.f;\n var splice = uncurryThis([].splice);\n var test = {};\n test[METADATA] = 1;\n\n // prevent exposing of metadata key\n if (getOwnPropertyNames(test).length) {\n getOwnPropertyNamesModule.f = function (it) {\n var result = getOwnPropertyNames(it);\n for (var i = 0, length = result.length; i < length; i++) {\n if (result[i] === METADATA) {\n splice(result, i, 1);\n break;\n }\n } return result;\n };\n\n $({ target: 'Object', stat: true, forced: true }, {\n getOwnPropertyNames: getOwnPropertyNamesExternalModule.f\n });\n }\n};\n\nvar meta = module.exports = {\n enable: enable,\n fastKey: fastKey,\n getWeakData: getWeakData,\n onFreeze: onFreeze\n};\n\nhiddenKeys[METADATA] = true;\n","var NATIVE_WEAK_MAP = require('../internals/weak-map-basic-detection');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar hasOwn = require('../internals/has-own-property');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar TypeError = global.TypeError;\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n var store = shared.state || (shared.state = new WeakMap());\n /* eslint-disable no-self-assign -- prototype methods protection */\n store.get = store.get;\n store.has = store.has;\n store.set = store.set;\n /* eslint-enable no-self-assign -- prototype methods protection */\n set = function (it, metadata) {\n if (store.has(it)) throw TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n store.set(it, metadata);\n return metadata;\n };\n get = function (it) {\n return store.get(it) || {};\n };\n has = function (it) {\n return store.has(it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n if (hasOwn(it, STATE)) throw TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return hasOwn(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return hasOwn(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","var classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.es/ecma262/#sec-isarray\n// eslint-disable-next-line es/no-array-isarray -- safe\nmodule.exports = Array.isArray || function isArray(argument) {\n return classof(argument) == 'Array';\n};\n","var $documentAll = require('../internals/document-all');\n\nvar documentAll = $documentAll.all;\n\n// `IsCallable` abstract operation\n// https://tc39.es/ecma262/#sec-iscallable\nmodule.exports = $documentAll.IS_HTMLDDA ? function (argument) {\n return typeof argument == 'function' || argument === documentAll;\n} : function (argument) {\n return typeof argument == 'function';\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar classof = require('../internals/classof');\nvar getBuiltIn = require('../internals/get-built-in');\nvar inspectSource = require('../internals/inspect-source');\n\nvar noop = function () { /* empty */ };\nvar empty = [];\nvar construct = getBuiltIn('Reflect', 'construct');\nvar constructorRegExp = /^\\s*(?:class|function)\\b/;\nvar exec = uncurryThis(constructorRegExp.exec);\nvar INCORRECT_TO_STRING = !constructorRegExp.exec(noop);\n\nvar isConstructorModern = function isConstructor(argument) {\n if (!isCallable(argument)) return false;\n try {\n construct(noop, empty, argument);\n return true;\n } catch (error) {\n return false;\n }\n};\n\nvar isConstructorLegacy = function isConstructor(argument) {\n if (!isCallable(argument)) return false;\n switch (classof(argument)) {\n case 'AsyncFunction':\n case 'GeneratorFunction':\n case 'AsyncGeneratorFunction': return false;\n }\n try {\n // we can't check .prototype since constructors produced by .bind haven't it\n // `Function#toString` throws on some built-it function in some legacy engines\n // (for example, `DOMQuad` and similar in FF41-)\n return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument));\n } catch (error) {\n return true;\n }\n};\n\nisConstructorLegacy.sham = true;\n\n// `IsConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-isconstructor\nmodule.exports = !construct || fails(function () {\n var called;\n return isConstructorModern(isConstructorModern.call)\n || !isConstructorModern(Object)\n || !isConstructorModern(function () { called = true; })\n || called;\n}) ? isConstructorLegacy : isConstructorModern;\n","var fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : isCallable(detection) ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","// we can't use just `it == null` since of `document.all` special case\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec\nmodule.exports = function (it) {\n return it === null || it === undefined;\n};\n","var isCallable = require('../internals/is-callable');\nvar $documentAll = require('../internals/document-all');\n\nvar documentAll = $documentAll.all;\n\nmodule.exports = $documentAll.IS_HTMLDDA ? function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it) || it === documentAll;\n} : function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it);\n};\n","module.exports = false;\n","var isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.es/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n","var getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar $Object = Object;\n\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n var $Symbol = getBuiltIn('Symbol');\n return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it));\n};\n","var bind = require('../internals/function-bind-context');\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar iteratorClose = require('../internals/iterator-close');\n\nvar $TypeError = TypeError;\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nvar ResultPrototype = Result.prototype;\n\nmodule.exports = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_RECORD = !!(options && options.IS_RECORD);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = bind(unboundFunction, that);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n if (iterator) iteratorClose(iterator, 'normal', condition);\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_RECORD) {\n iterator = iterable.iterator;\n } else if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (!iterFn) throw $TypeError(tryToString(iterable) + ' is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n }\n iterator = getIterator(iterable, iterFn);\n }\n\n next = IS_RECORD ? iterable.next : iterator.next;\n while (!(step = call(next, iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n};\n","var call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar getMethod = require('../internals/get-method');\n\nmodule.exports = function (iterator, kind, value) {\n var innerResult, innerError;\n anObject(iterator);\n try {\n innerResult = getMethod(iterator, 'return');\n if (!innerResult) {\n if (kind === 'throw') throw value;\n return value;\n }\n innerResult = call(innerResult, iterator);\n } catch (error) {\n innerError = true;\n innerResult = error;\n }\n if (kind === 'throw') throw value;\n if (innerError) throw innerResult;\n anObject(innerResult);\n return value;\n};\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next, ENUMERABLE_NEXT) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(+!ENUMERABLE_NEXT, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar IS_PURE = require('../internals/is-pure');\nvar FunctionName = require('../internals/function-name');\nvar isCallable = require('../internals/is-callable');\nvar createIteratorConstructor = require('../internals/iterator-create-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar PROPER_FUNCTION_NAME = FunctionName.PROPER;\nvar CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE;\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) {\n defineBuiltIn(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array.prototype.{ values, @@iterator }.name in V8 / FF\n if (PROPER_FUNCTION_NAME && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) {\n createNonEnumerableProperty(IterablePrototype, 'name', VALUES);\n } else {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return call(nativeIterator, this); };\n }\n }\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n defineBuiltIn(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n defineBuiltIn(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT });\n }\n Iterators[NAME] = defaultIterator;\n\n return methods;\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\n// `%IteratorPrototype%` object\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n/* eslint-disable es/no-array-prototype-keys -- safe */\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nvar NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () {\n var test = {};\n // FF44- legacy iterators case\n return IteratorPrototype[ITERATOR].call(test) !== test;\n});\n\nif (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};\nelse if (IS_PURE) IteratorPrototype = create(IteratorPrototype);\n\n// `%IteratorPrototype%[@@iterator]()` method\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator\nif (!isCallable(IteratorPrototype[ITERATOR])) {\n defineBuiltIn(IteratorPrototype, ITERATOR, function () {\n return this;\n });\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","module.exports = {};\n","var toLength = require('../internals/to-length');\n\n// `LengthOfArrayLike` abstract operation\n// https://tc39.es/ecma262/#sec-lengthofarraylike\nmodule.exports = function (obj) {\n return toLength(obj.length);\n};\n","var fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar CONFIGURABLE_FUNCTION_NAME = require('../internals/function-name').CONFIGURABLE;\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nvar CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () {\n return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8;\n});\n\nvar TEMPLATE = String(String).split('String');\n\nvar makeBuiltIn = module.exports = function (value, name, options) {\n if (String(name).slice(0, 7) === 'Symbol(') {\n name = '[' + String(name).replace(/^Symbol\\(([^)]*)\\)/, '$1') + ']';\n }\n if (options && options.getter) name = 'get ' + name;\n if (options && options.setter) name = 'set ' + name;\n if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {\n if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true });\n else value.name = name;\n }\n if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) {\n defineProperty(value, 'length', { value: options.arity });\n }\n try {\n if (options && hasOwn(options, 'constructor') && options.constructor) {\n if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false });\n // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable\n } else if (value.prototype) value.prototype = undefined;\n } catch (error) { /* empty */ }\n var state = enforceInternalState(value);\n if (!hasOwn(state, 'source')) {\n state.source = TEMPLATE.join(typeof name == 'string' ? name : '');\n } return value;\n};\n\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n// eslint-disable-next-line no-extend-native -- required\nFunction.prototype.toString = makeBuiltIn(function toString() {\n return isCallable(this) && getInternalState(this).source || inspectSource(this);\n}, 'toString');\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.es/ecma262/#sec-math.trunc\n// eslint-disable-next-line es/no-math-trunc -- safe\nmodule.exports = Math.trunc || function trunc(x) {\n var n = +x;\n return (n > 0 ? floor : ceil)(n);\n};\n","var global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toString = require('../internals/to-string');\nvar trim = require('../internals/string-trim').trim;\nvar whitespaces = require('../internals/whitespaces');\n\nvar $parseInt = global.parseInt;\nvar Symbol = global.Symbol;\nvar ITERATOR = Symbol && Symbol.iterator;\nvar hex = /^[+-]?0x/i;\nvar exec = uncurryThis(hex.exec);\nvar FORCED = $parseInt(whitespaces + '08') !== 8 || $parseInt(whitespaces + '0x16') !== 22\n // MS Edge 18- broken with boxed symbols\n || (ITERATOR && !fails(function () { $parseInt(Object(ITERATOR)); }));\n\n// `parseInt` method\n// https://tc39.es/ecma262/#sec-parseint-string-radix\nmodule.exports = FORCED ? function parseInt(string, radix) {\n var S = trim(toString(string));\n return $parseInt(S, (radix >>> 0) || (exec(hex, S) ? 16 : 10));\n} : $parseInt;\n","/* global ActiveXObject -- old IE, WSH */\nvar anObject = require('../internals/an-object');\nvar definePropertiesModule = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n activeXDocument = new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = typeof document != 'undefined'\n ? document.domain && activeXDocument\n ? NullProtoObjectViaActiveX(activeXDocument) // old IE\n : NullProtoObjectViaIFrame()\n : NullProtoObjectViaActiveX(activeXDocument); // WSH\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\n// eslint-disable-next-line es/no-object-create -- safe\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : definePropertiesModule.f(result, Properties);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\n// eslint-disable-next-line es/no-object-defineproperties -- safe\nexports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var props = toIndexedObject(Properties);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]);\n return O;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar anObject = require('../internals/an-object');\nvar toPropertyKey = require('../internals/to-property-key');\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar ENUMERABLE = 'enumerable';\nvar CONFIGURABLE = 'configurable';\nvar WRITABLE = 'writable';\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {\n var current = $getOwnPropertyDescriptor(O, P);\n if (current && current[WRITABLE]) {\n O[P] = Attributes.value;\n Attributes = {\n configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],\n enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],\n writable: false\n };\n }\n } return $defineProperty(O, P, Attributes);\n} : $defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return $defineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw $TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar call = require('../internals/function-call');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPropertyKey = require('../internals/to-property-key');\nvar hasOwn = require('../internals/has-own-property');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPropertyKey(P);\n if (IE8_DOM_DEFINE) try {\n return $getOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);\n};\n","/* eslint-disable es/no-object-getownpropertynames -- safe */\nvar classof = require('../internals/classof-raw');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar $getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar arraySlice = require('../internals/array-slice-simple');\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return $getOwnPropertyNames(it);\n } catch (error) {\n return arraySlice(windowNames);\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && classof(it) == 'Window'\n ? getWindowNames(it)\n : $getOwnPropertyNames(toIndexedObject(it));\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n","var hasOwn = require('../internals/has-own-property');\nvar isCallable = require('../internals/is-callable');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar $Object = Object;\nvar ObjectPrototype = $Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\n// eslint-disable-next-line es/no-object-getprototypeof -- safe\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) {\n var object = toObject(O);\n if (hasOwn(object, IE_PROTO)) return object[IE_PROTO];\n var constructor = object.constructor;\n if (isCallable(constructor) && object instanceof constructor) {\n return constructor.prototype;\n } return object instanceof $Object ? ObjectPrototype : null;\n};\n","var fails = require('../internals/fails');\nvar isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar ARRAY_BUFFER_NON_EXTENSIBLE = require('../internals/array-buffer-non-extensible');\n\n// eslint-disable-next-line es/no-object-isextensible -- safe\nvar $isExtensible = Object.isExtensible;\nvar FAILS_ON_PRIMITIVES = fails(function () { $isExtensible(1); });\n\n// `Object.isExtensible` method\n// https://tc39.es/ecma262/#sec-object.isextensible\nmodule.exports = (FAILS_ON_PRIMITIVES || ARRAY_BUFFER_NON_EXTENSIBLE) ? function isExtensible(it) {\n if (!isObject(it)) return false;\n if (ARRAY_BUFFER_NON_EXTENSIBLE && classof(it) == 'ArrayBuffer') return false;\n return $isExtensible ? $isExtensible(it) : true;\n} : $isExtensible;\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis({}.isPrototypeOf);\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar hasOwn = require('../internals/has-own-property');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar push = uncurryThis([].push);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (hasOwn(O, key = names[i++])) {\n ~indexOf(result, key) || push(result, key);\n }\n return result;\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n// eslint-disable-next-line es/no-object-keys -- safe\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","'use strict';\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n","/* eslint-disable no-proto -- safe */\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar anObject = require('../internals/an-object');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n// eslint-disable-next-line es/no-object-setprototypeof -- safe\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n setter = uncurryThis(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set);\n setter(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classof = require('../internals/classof');\n\n// `Object.prototype.toString` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.tostring\nmodule.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {\n return '[object ' + classof(this) + ']';\n};\n","var call = require('../internals/function-call');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\n\nvar $TypeError = TypeError;\n\n// `OrdinaryToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-ordinarytoprimitive\nmodule.exports = function (input, pref) {\n var fn, val;\n if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;\n if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n throw $TypeError(\"Can't convert object to primitive value\");\n};\n","var getBuiltIn = require('../internals/get-built-in');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\nvar concat = uncurryThis([].concat);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;\n};\n","var global = require('../internals/global');\n\nmodule.exports = global;\n","var defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (Target, Source, key) {\n key in Target || defineProperty(Target, key, {\n configurable: true,\n get: function () { return Source[key]; },\n set: function (it) { Source[key] = it; }\n });\n};\n","var call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar isCallable = require('../internals/is-callable');\nvar classof = require('../internals/classof-raw');\nvar regexpExec = require('../internals/regexp-exec');\n\nvar $TypeError = TypeError;\n\n// `RegExpExec` abstract operation\n// https://tc39.es/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (isCallable(exec)) {\n var result = call(exec, R, S);\n if (result !== null) anObject(result);\n return result;\n }\n if (classof(R) === 'RegExp') return call(regexpExec, R, S);\n throw $TypeError('RegExp#exec called on incompatible receiver');\n};\n","'use strict';\n/* eslint-disable regexp/no-empty-capturing-group, regexp/no-empty-group, regexp/no-lazy-ends -- testing */\n/* eslint-disable regexp/no-useless-quantifier -- testing */\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toString = require('../internals/to-string');\nvar regexpFlags = require('../internals/regexp-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar shared = require('../internals/shared');\nvar create = require('../internals/object-create');\nvar getInternalState = require('../internals/internal-state').get;\nvar UNSUPPORTED_DOT_ALL = require('../internals/regexp-unsupported-dot-all');\nvar UNSUPPORTED_NCG = require('../internals/regexp-unsupported-ncg');\n\nvar nativeReplace = shared('native-string-replace', String.prototype.replace);\nvar nativeExec = RegExp.prototype.exec;\nvar patchedExec = nativeExec;\nvar charAt = uncurryThis(''.charAt);\nvar indexOf = uncurryThis(''.indexOf);\nvar replace = uncurryThis(''.replace);\nvar stringSlice = uncurryThis(''.slice);\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n call(nativeExec, re1, 'a');\n call(nativeExec, re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y = stickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG;\n\nif (PATCH) {\n patchedExec = function exec(string) {\n var re = this;\n var state = getInternalState(re);\n var str = toString(string);\n var raw = state.raw;\n var result, reCopy, lastIndex, match, i, object, group;\n\n if (raw) {\n raw.lastIndex = re.lastIndex;\n result = call(patchedExec, raw, str);\n re.lastIndex = raw.lastIndex;\n return result;\n }\n\n var groups = state.groups;\n var sticky = UNSUPPORTED_Y && re.sticky;\n var flags = call(regexpFlags, re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = replace(flags, 'y', '');\n if (indexOf(flags, 'g') === -1) {\n flags += 'g';\n }\n\n strCopy = stringSlice(str, re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && charAt(str, re.lastIndex - 1) !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = call(nativeExec, sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = stringSlice(match.input, charsAdded);\n match[0] = stringSlice(match[0], charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn't work for /(.?)?/\n call(nativeReplace, match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n if (match && groups) {\n match.groups = object = create(null);\n for (i = 0; i < groups.length; i++) {\n group = groups[i];\n object[group[0]] = match[group[1]];\n }\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.hasIndices) result += 'd';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.unicodeSets) result += 'v';\n if (that.sticky) result += 'y';\n return result;\n};\n","var call = require('../internals/function-call');\nvar hasOwn = require('../internals/has-own-property');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar regExpFlags = require('../internals/regexp-flags');\n\nvar RegExpPrototype = RegExp.prototype;\n\nmodule.exports = function (R) {\n var flags = R.flags;\n return flags === undefined && !('flags' in RegExpPrototype) && !hasOwn(R, 'flags') && isPrototypeOf(RegExpPrototype, R)\n ? call(regExpFlags, R) : flags;\n};\n","var fails = require('../internals/fails');\nvar global = require('../internals/global');\n\n// babel-minify and Closure Compiler transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\nvar $RegExp = global.RegExp;\n\nvar UNSUPPORTED_Y = fails(function () {\n var re = $RegExp('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') != null;\n});\n\n// UC Browser bug\n// https://github.com/zloirock/core-js/issues/1008\nvar MISSED_STICKY = UNSUPPORTED_Y || fails(function () {\n return !$RegExp('a', 'y').sticky;\n});\n\nvar BROKEN_CARET = UNSUPPORTED_Y || fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = $RegExp('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') != null;\n});\n\nmodule.exports = {\n BROKEN_CARET: BROKEN_CARET,\n MISSED_STICKY: MISSED_STICKY,\n UNSUPPORTED_Y: UNSUPPORTED_Y\n};\n","var fails = require('../internals/fails');\nvar global = require('../internals/global');\n\n// babel-minify and Closure Compiler transpiles RegExp('.', 's') -> /./s and it causes SyntaxError\nvar $RegExp = global.RegExp;\n\nmodule.exports = fails(function () {\n var re = $RegExp('.', 's');\n return !(re.dotAll && re.exec('\\n') && re.flags === 's');\n});\n","var fails = require('../internals/fails');\nvar global = require('../internals/global');\n\n// babel-minify and Closure Compiler transpiles RegExp('(?b)', 'g') -> /(?b)/g and it causes SyntaxError\nvar $RegExp = global.RegExp;\n\nmodule.exports = fails(function () {\n var re = $RegExp('(?b)', 'g');\n return re.exec('b').groups.a !== 'b' ||\n 'b'.replace(re, '$c') !== 'bc';\n});\n","var isNullOrUndefined = require('../internals/is-null-or-undefined');\n\nvar $TypeError = TypeError;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (isNullOrUndefined(it)) throw $TypeError(\"Can't call method on \" + it);\n return it;\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar definePropertyModule = require('../internals/object-define-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = definePropertyModule.f;\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineProperty(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n","var defineProperty = require('../internals/object-define-property').f;\nvar hasOwn = require('../internals/has-own-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (target, TAG, STATIC) {\n if (target && !STATIC) target = target.prototype;\n if (target && !hasOwn(target, TO_STRING_TAG)) {\n defineProperty(target, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","var global = require('../internals/global');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || defineGlobalProperty(SHARED, {});\n\nmodule.exports = store;\n","var IS_PURE = require('../internals/is-pure');\nvar store = require('../internals/shared-store');\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.27.1',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2014-2022 Denis Pushkarev (zloirock.ru)',\n license: 'https://github.com/zloirock/core-js/blob/v3.27.1/LICENSE',\n source: 'https://github.com/zloirock/core-js'\n});\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar charAt = uncurryThis(''.charAt);\nvar charCodeAt = uncurryThis(''.charCodeAt);\nvar stringSlice = uncurryThis(''.slice);\n\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = toString(requireObjectCoercible($this));\n var position = toIntegerOrInfinity(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = charCodeAt(S, position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING\n ? charAt(S, position)\n : first\n : CONVERT_TO_STRING\n ? stringSlice(S, position, position + 2)\n : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.es/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toString = require('../internals/to-string');\nvar whitespaces = require('../internals/whitespaces');\n\nvar replace = uncurryThis(''.replace);\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = toString(requireObjectCoercible($this));\n if (TYPE & 1) string = replace(string, ltrim, '');\n if (TYPE & 2) string = replace(string, rtrim, '');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.es/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n","/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = require('../internals/engine-v8-version');\nvar fails = require('../internals/fails');\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n var symbol = Symbol();\n // Chrome 38 Symbol has incorrect toString conversion\n // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n return !String(symbol) || !(Object(symbol) instanceof Symbol) ||\n // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n","var uncurryThis = require('../internals/function-uncurry-this');\n\n// `thisNumberValue` abstract operation\n// https://tc39.es/ecma262/#sec-thisnumbervalue\nmodule.exports = uncurryThis(1.0.valueOf);\n","var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toIntegerOrInfinity(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","var trunc = require('../internals/math-trunc');\n\n// `ToIntegerOrInfinity` abstract operation\n// https://tc39.es/ecma262/#sec-tointegerorinfinity\nmodule.exports = function (argument) {\n var number = +argument;\n // eslint-disable-next-line no-self-compare -- NaN check\n return number !== number || number === 0 ? 0 : trunc(number);\n};\n","var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","var requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar $Object = Object;\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return $Object(requireObjectCoercible(argument));\n};\n","var call = require('../internals/function-call');\nvar isObject = require('../internals/is-object');\nvar isSymbol = require('../internals/is-symbol');\nvar getMethod = require('../internals/get-method');\nvar ordinaryToPrimitive = require('../internals/ordinary-to-primitive');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $TypeError = TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n if (!isObject(input) || isSymbol(input)) return input;\n var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n var result;\n if (exoticToPrim) {\n if (pref === undefined) pref = 'default';\n result = call(exoticToPrim, input, pref);\n if (!isObject(result) || isSymbol(result)) return result;\n throw $TypeError(\"Can't convert object to primitive value\");\n }\n if (pref === undefined) pref = 'number';\n return ordinaryToPrimitive(input, pref);\n};\n","var toPrimitive = require('../internals/to-primitive');\nvar isSymbol = require('../internals/is-symbol');\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n var key = toPrimitive(argument, 'string');\n return isSymbol(key) ? key : key + '';\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","var classof = require('../internals/classof');\n\nvar $String = String;\n\nmodule.exports = function (argument) {\n if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string');\n return $String(argument);\n};\n","var $String = String;\n\nmodule.exports = function (argument) {\n try {\n return $String(argument);\n } catch (error) {\n return 'Object';\n }\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.0.toString);\n\nmodule.exports = function (key) {\n return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n","/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\n\nmodule.exports = NATIVE_SYMBOL\n && !Symbol.sham\n && typeof Symbol.iterator == 'symbol';\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\n\n// V8 ~ Chrome 36-\n// https://bugs.chromium.org/p/v8/issues/detail?id=3334\nmodule.exports = DESCRIPTORS && fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(function () { /* empty */ }, 'prototype', {\n value: 42,\n writable: false\n }).prototype != 42;\n});\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap));\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar hasOwn = require('../internals/has-own-property');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol = global.Symbol;\nvar symbolFor = Symbol && Symbol['for'];\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!hasOwn(WellKnownSymbolsStore, name) || !(NATIVE_SYMBOL || typeof WellKnownSymbolsStore[name] == 'string')) {\n var description = 'Symbol.' + name;\n if (NATIVE_SYMBOL && hasOwn(Symbol, name)) {\n WellKnownSymbolsStore[name] = Symbol[name];\n } else if (USE_SYMBOL_AS_UID && symbolFor) {\n WellKnownSymbolsStore[name] = symbolFor(description);\n } else {\n WellKnownSymbolsStore[name] = createWellKnownSymbol(description);\n }\n } return WellKnownSymbolsStore[name];\n};\n","// a string of all valid unicode whitespaces\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002' +\n '\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","'use strict';\nvar $ = require('../internals/export');\nvar $find = require('../internals/array-iteration').find;\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\n// Shouldn't skip holes\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.es/ecma262/#sec-array.prototype.find\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND);\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineProperty = require('../internals/object-define-property').f;\nvar defineIterator = require('../internals/iterator-define');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar IS_PURE = require('../internals/is-pure');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.es/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.es/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.es/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.es/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return createIterResultObject(undefined, true);\n }\n if (kind == 'keys') return createIterResultObject(index, false);\n if (kind == 'values') return createIterResultObject(target[index], false);\n return createIterResultObject([index, target[index]], false);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.es/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.es/ecma262/#sec-createmappedargumentsobject\nvar values = Iterators.Arguments = Iterators.Array;\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n// V8 ~ Chrome 45- bug\nif (!IS_PURE && DESCRIPTORS && values.name !== 'values') try {\n defineProperty(values, 'name', { value: 'values' });\n} catch (error) { /* empty */ }\n","'use strict';\nvar $ = require('../internals/export');\nvar $map = require('../internals/array-iteration').map;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n\n// `Array.prototype.map` method\n// https://tc39.es/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar collection = require('../internals/collection');\nvar collectionStrong = require('../internals/collection-strong');\n\n// `Map` constructor\n// https://tc39.es/ecma262/#sec-map-objects\ncollection('Map', function (init) {\n return function Map() { return init(this, arguments.length ? arguments[0] : undefined); };\n}, collectionStrong);\n","// TODO: Remove this module from `core-js@4` since it's replaced to module below\nrequire('../modules/es.map.constructor');\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar path = require('../internals/path');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isForced = require('../internals/is-forced');\nvar hasOwn = require('../internals/has-own-property');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar isSymbol = require('../internals/is-symbol');\nvar toPrimitive = require('../internals/to-primitive');\nvar fails = require('../internals/fails');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar defineProperty = require('../internals/object-define-property').f;\nvar thisNumberValue = require('../internals/this-number-value');\nvar trim = require('../internals/string-trim').trim;\n\nvar NUMBER = 'Number';\nvar NativeNumber = global[NUMBER];\nvar PureNumberNamespace = path[NUMBER];\nvar NumberPrototype = NativeNumber.prototype;\nvar TypeError = global.TypeError;\nvar stringSlice = uncurryThis(''.slice);\nvar charCodeAt = uncurryThis(''.charCodeAt);\n\n// `ToNumeric` abstract operation\n// https://tc39.es/ecma262/#sec-tonumeric\nvar toNumeric = function (value) {\n var primValue = toPrimitive(value, 'number');\n return typeof primValue == 'bigint' ? primValue : toNumber(primValue);\n};\n\n// `ToNumber` abstract operation\n// https://tc39.es/ecma262/#sec-tonumber\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, 'number');\n var first, third, radix, maxCode, digits, length, index, code;\n if (isSymbol(it)) throw TypeError('Cannot convert a Symbol value to a number');\n if (typeof it == 'string' && it.length > 2) {\n it = trim(it);\n first = charCodeAt(it, 0);\n if (first === 43 || first === 45) {\n third = charCodeAt(it, 2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (charCodeAt(it, 1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal of /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i\n default: return +it;\n }\n digits = stringSlice(it, 2);\n length = digits.length;\n for (index = 0; index < length; index++) {\n code = charCodeAt(digits, index);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n};\n\nvar FORCED = isForced(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'));\n\nvar calledWithNew = function (dummy) {\n // includes check on 1..constructor(foo) case\n return isPrototypeOf(NumberPrototype, dummy) && fails(function () { thisNumberValue(dummy); });\n};\n\n// `Number` constructor\n// https://tc39.es/ecma262/#sec-number-constructor\nvar NumberWrapper = function Number(value) {\n var n = arguments.length < 1 ? 0 : NativeNumber(toNumeric(value));\n return calledWithNew(this) ? inheritIfRequired(Object(n), this, NumberWrapper) : n;\n};\n\nNumberWrapper.prototype = NumberPrototype;\nif (FORCED && !IS_PURE) NumberPrototype.constructor = NumberWrapper;\n\n$({ global: true, constructor: true, wrap: true, forced: FORCED }, {\n Number: NumberWrapper\n});\n\n// Use `internal/copy-constructor-properties` helper in `core-js@4`\nvar copyConstructorProperties = function (target, source) {\n for (var keys = DESCRIPTORS ? getOwnPropertyNames(source) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES2015 (in case, if modules with ES2015 Number statics required before):\n 'EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,' +\n // ESNext\n 'fromString,range'\n ).split(','), j = 0, key; keys.length > j; j++) {\n if (hasOwn(source, key = keys[j]) && !hasOwn(target, key)) {\n defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n }\n};\n\nif (IS_PURE && PureNumberNamespace) copyConstructorProperties(path[NUMBER], PureNumberNamespace);\nif (FORCED || IS_PURE) copyConstructorProperties(path[NUMBER], NativeNumber);\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar toString = require('../internals/object-to-string');\n\n// `Object.prototype.toString` method\n// https://tc39.es/ecma262/#sec-object.prototype.tostring\nif (!TO_STRING_TAG_SUPPORT) {\n defineBuiltIn(Object.prototype, 'toString', toString, { unsafe: true });\n}\n","var $ = require('../internals/export');\nvar $parseInt = require('../internals/number-parse-int');\n\n// `parseInt` method\n// https://tc39.es/ecma262/#sec-parseint-string-radix\n$({ global: true, forced: parseInt != $parseInt }, {\n parseInt: $parseInt\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isForced = require('../internals/is-forced');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar isRegExp = require('../internals/is-regexp');\nvar toString = require('../internals/to-string');\nvar getRegExpFlags = require('../internals/regexp-get-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar proxyAccessor = require('../internals/proxy-accessor');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar fails = require('../internals/fails');\nvar hasOwn = require('../internals/has-own-property');\nvar enforceInternalState = require('../internals/internal-state').enforce;\nvar setSpecies = require('../internals/set-species');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar UNSUPPORTED_DOT_ALL = require('../internals/regexp-unsupported-dot-all');\nvar UNSUPPORTED_NCG = require('../internals/regexp-unsupported-ncg');\n\nvar MATCH = wellKnownSymbol('match');\nvar NativeRegExp = global.RegExp;\nvar RegExpPrototype = NativeRegExp.prototype;\nvar SyntaxError = global.SyntaxError;\nvar exec = uncurryThis(RegExpPrototype.exec);\nvar charAt = uncurryThis(''.charAt);\nvar replace = uncurryThis(''.replace);\nvar stringIndexOf = uncurryThis(''.indexOf);\nvar stringSlice = uncurryThis(''.slice);\n// TODO: Use only proper RegExpIdentifierName\nvar IS_NCG = /^\\?<[^\\s\\d!#%&*+<=>@^][^\\s!#%&*+<=>@^]*>/;\nvar re1 = /a/g;\nvar re2 = /a/g;\n\n// \"new\" should create a new object, old webkit bug\nvar CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\nvar MISSED_STICKY = stickyHelpers.MISSED_STICKY;\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;\n\nvar BASE_FORCED = DESCRIPTORS &&\n (!CORRECT_NEW || MISSED_STICKY || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG || fails(function () {\n re2[MATCH] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';\n }));\n\nvar handleDotAll = function (string) {\n var length = string.length;\n var index = 0;\n var result = '';\n var brackets = false;\n var chr;\n for (; index <= length; index++) {\n chr = charAt(string, index);\n if (chr === '\\\\') {\n result += chr + charAt(string, ++index);\n continue;\n }\n if (!brackets && chr === '.') {\n result += '[\\\\s\\\\S]';\n } else {\n if (chr === '[') {\n brackets = true;\n } else if (chr === ']') {\n brackets = false;\n } result += chr;\n }\n } return result;\n};\n\nvar handleNCG = function (string) {\n var length = string.length;\n var index = 0;\n var result = '';\n var named = [];\n var names = {};\n var brackets = false;\n var ncg = false;\n var groupid = 0;\n var groupname = '';\n var chr;\n for (; index <= length; index++) {\n chr = charAt(string, index);\n if (chr === '\\\\') {\n chr = chr + charAt(string, ++index);\n } else if (chr === ']') {\n brackets = false;\n } else if (!brackets) switch (true) {\n case chr === '[':\n brackets = true;\n break;\n case chr === '(':\n if (exec(IS_NCG, stringSlice(string, index + 1))) {\n index += 2;\n ncg = true;\n }\n result += chr;\n groupid++;\n continue;\n case chr === '>' && ncg:\n if (groupname === '' || hasOwn(names, groupname)) {\n throw new SyntaxError('Invalid capture group name');\n }\n names[groupname] = true;\n named[named.length] = [groupname, groupid];\n ncg = false;\n groupname = '';\n continue;\n }\n if (ncg) groupname += chr;\n else result += chr;\n } return [result, named];\n};\n\n// `RegExp` constructor\n// https://tc39.es/ecma262/#sec-regexp-constructor\nif (isForced('RegExp', BASE_FORCED)) {\n var RegExpWrapper = function RegExp(pattern, flags) {\n var thisIsRegExp = isPrototypeOf(RegExpPrototype, this);\n var patternIsRegExp = isRegExp(pattern);\n var flagsAreUndefined = flags === undefined;\n var groups = [];\n var rawPattern = pattern;\n var rawFlags, dotAll, sticky, handled, result, state;\n\n if (!thisIsRegExp && patternIsRegExp && flagsAreUndefined && pattern.constructor === RegExpWrapper) {\n return pattern;\n }\n\n if (patternIsRegExp || isPrototypeOf(RegExpPrototype, pattern)) {\n pattern = pattern.source;\n if (flagsAreUndefined) flags = getRegExpFlags(rawPattern);\n }\n\n pattern = pattern === undefined ? '' : toString(pattern);\n flags = flags === undefined ? '' : toString(flags);\n rawPattern = pattern;\n\n if (UNSUPPORTED_DOT_ALL && 'dotAll' in re1) {\n dotAll = !!flags && stringIndexOf(flags, 's') > -1;\n if (dotAll) flags = replace(flags, /s/g, '');\n }\n\n rawFlags = flags;\n\n if (MISSED_STICKY && 'sticky' in re1) {\n sticky = !!flags && stringIndexOf(flags, 'y') > -1;\n if (sticky && UNSUPPORTED_Y) flags = replace(flags, /y/g, '');\n }\n\n if (UNSUPPORTED_NCG) {\n handled = handleNCG(pattern);\n pattern = handled[0];\n groups = handled[1];\n }\n\n result = inheritIfRequired(NativeRegExp(pattern, flags), thisIsRegExp ? this : RegExpPrototype, RegExpWrapper);\n\n if (dotAll || sticky || groups.length) {\n state = enforceInternalState(result);\n if (dotAll) {\n state.dotAll = true;\n state.raw = RegExpWrapper(handleDotAll(pattern), rawFlags);\n }\n if (sticky) state.sticky = true;\n if (groups.length) state.groups = groups;\n }\n\n if (pattern !== rawPattern) try {\n // fails in old engines, but we have no alternatives for unsupported regex syntax\n createNonEnumerableProperty(result, 'source', rawPattern === '' ? '(?:)' : rawPattern);\n } catch (error) { /* empty */ }\n\n return result;\n };\n\n for (var keys = getOwnPropertyNames(NativeRegExp), index = 0; keys.length > index;) {\n proxyAccessor(RegExpWrapper, NativeRegExp, keys[index++]);\n }\n\n RegExpPrototype.constructor = RegExpWrapper;\n RegExpWrapper.prototype = RegExpPrototype;\n defineBuiltIn(global, 'RegExp', RegExpWrapper, { constructor: true });\n}\n\n// https://tc39.es/ecma262/#sec-get-regexp-@@species\nsetSpecies('RegExp');\n","var DESCRIPTORS = require('../internals/descriptors');\nvar UNSUPPORTED_DOT_ALL = require('../internals/regexp-unsupported-dot-all');\nvar classof = require('../internals/classof-raw');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar getInternalState = require('../internals/internal-state').get;\n\nvar RegExpPrototype = RegExp.prototype;\nvar $TypeError = TypeError;\n\n// `RegExp.prototype.dotAll` getter\n// https://tc39.es/ecma262/#sec-get-regexp.prototype.dotall\nif (DESCRIPTORS && UNSUPPORTED_DOT_ALL) {\n defineBuiltInAccessor(RegExpPrototype, 'dotAll', {\n configurable: true,\n get: function dotAll() {\n if (this === RegExpPrototype) return undefined;\n // We can't use InternalStateModule.getterFor because\n // we don't add metadata for regexps created by a literal.\n if (classof(this) === 'RegExp') {\n return !!getInternalState(this).dotAll;\n }\n throw $TypeError('Incompatible receiver, RegExp required');\n }\n });\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar exec = require('../internals/regexp-exec');\n\n// `RegExp.prototype.exec` method\n// https://tc39.es/ecma262/#sec-regexp.prototype.exec\n$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {\n exec: exec\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar MISSED_STICKY = require('../internals/regexp-sticky-helpers').MISSED_STICKY;\nvar classof = require('../internals/classof-raw');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar getInternalState = require('../internals/internal-state').get;\n\nvar RegExpPrototype = RegExp.prototype;\nvar $TypeError = TypeError;\n\n// `RegExp.prototype.sticky` getter\n// https://tc39.es/ecma262/#sec-get-regexp.prototype.sticky\nif (DESCRIPTORS && MISSED_STICKY) {\n defineBuiltInAccessor(RegExpPrototype, 'sticky', {\n configurable: true,\n get: function sticky() {\n if (this === RegExpPrototype) return undefined;\n // We can't use InternalStateModule.getterFor because\n // we don't add metadata for regexps created by a literal.\n if (classof(this) === 'RegExp') {\n return !!getInternalState(this).sticky;\n }\n throw $TypeError('Incompatible receiver, RegExp required');\n }\n });\n}\n","'use strict';\n// TODO: Remove from `core-js@4` since it's moved to entry points\nrequire('../modules/es.regexp.exec');\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar isCallable = require('../internals/is-callable');\nvar anObject = require('../internals/an-object');\nvar toString = require('../internals/to-string');\n\nvar DELEGATES_TO_EXEC = function () {\n var execCalled = false;\n var re = /[ac]/;\n re.exec = function () {\n execCalled = true;\n return /./.exec.apply(this, arguments);\n };\n return re.test('abc') === true && execCalled;\n}();\n\nvar nativeTest = /./.test;\n\n// `RegExp.prototype.test` method\n// https://tc39.es/ecma262/#sec-regexp.prototype.test\n$({ target: 'RegExp', proto: true, forced: !DELEGATES_TO_EXEC }, {\n test: function (S) {\n var R = anObject(this);\n var string = toString(S);\n var exec = R.exec;\n if (!isCallable(exec)) return call(nativeTest, R, string);\n var result = call(exec, R, string);\n if (result === null) return false;\n anObject(result);\n return true;\n }\n});\n","'use strict';\nvar PROPER_FUNCTION_NAME = require('../internals/function-name').PROPER;\nvar defineBuiltIn = require('../internals/define-built-in');\nvar anObject = require('../internals/an-object');\nvar $toString = require('../internals/to-string');\nvar fails = require('../internals/fails');\nvar getRegExpFlags = require('../internals/regexp-get-flags');\n\nvar TO_STRING = 'toString';\nvar RegExpPrototype = RegExp.prototype;\nvar nativeToString = RegExpPrototype[TO_STRING];\n\nvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n// FF44- RegExp#toString has a wrong name\nvar INCORRECT_NAME = PROPER_FUNCTION_NAME && nativeToString.name != TO_STRING;\n\n// `RegExp.prototype.toString` method\n// https://tc39.es/ecma262/#sec-regexp.prototype.tostring\nif (NOT_GENERIC || INCORRECT_NAME) {\n defineBuiltIn(RegExp.prototype, TO_STRING, function toString() {\n var R = anObject(this);\n var pattern = $toString(R.source);\n var flags = $toString(getRegExpFlags(R));\n return '/' + pattern + '/' + flags;\n }, { unsafe: true });\n}\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\nvar toString = require('../internals/to-string');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/iterator-define');\nvar createIterResultObject = require('../internals/create-iter-result-object');\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: toString(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return createIterResultObject(undefined, true);\n point = charAt(string, index);\n state.index += point.length;\n return createIterResultObject(point, false);\n});\n","'use strict';\nvar call = require('../internals/function-call');\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar getMethod = require('../internals/get-method');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.es/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = isNullOrUndefined(regexp) ? undefined : getMethod(regexp, MATCH);\n return matcher ? call(matcher, regexp, O) : new RegExp(regexp)[MATCH](toString(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@match\n function (string) {\n var rx = anObject(this);\n var S = toString(string);\n var res = maybeCallNative(nativeMatch, rx, S);\n\n if (res.done) return res.value;\n\n if (!rx.global) return regExpExec(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = toString(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n","'use strict';\nvar apply = require('../internals/function-apply');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar fails = require('../internals/fails');\nvar anObject = require('../internals/an-object');\nvar isCallable = require('../internals/is-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar getMethod = require('../internals/get-method');\nvar getSubstitution = require('../internals/get-substitution');\nvar regExpExec = require('../internals/regexp-exec-abstract');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar REPLACE = wellKnownSymbol('replace');\nvar max = Math.max;\nvar min = Math.min;\nvar concat = uncurryThis([].concat);\nvar push = uncurryThis([].push);\nvar stringIndexOf = uncurryThis(''.indexOf);\nvar stringSlice = uncurryThis(''.slice);\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n // eslint-disable-next-line regexp/prefer-escape-replacement-dollar-char -- required for testing\n return 'a'.replace(/./, '$0') === '$0';\n})();\n\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n})();\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n // eslint-disable-next-line regexp/no-useless-dollar-replacements -- false positive\n return ''.replace(re, '$') !== '7';\n});\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', function (_, nativeReplace, maybeCallNative) {\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.es/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = isNullOrUndefined(searchValue) ? undefined : getMethod(searchValue, REPLACE);\n return replacer\n ? call(replacer, searchValue, O, replaceValue)\n : call(nativeReplace, toString(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace\n function (string, replaceValue) {\n var rx = anObject(this);\n var S = toString(string);\n\n if (\n typeof replaceValue == 'string' &&\n stringIndexOf(replaceValue, UNSAFE_SUBSTITUTE) === -1 &&\n stringIndexOf(replaceValue, '$<') === -1\n ) {\n var res = maybeCallNative(nativeReplace, rx, S, replaceValue);\n if (res.done) return res.value;\n }\n\n var functionalReplace = isCallable(replaceValue);\n if (!functionalReplace) replaceValue = toString(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n\n push(results, result);\n if (!global) break;\n\n var matchStr = toString(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = toString(result[0]);\n var position = max(min(toIntegerOrInfinity(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) push(captures, maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = concat([matched], captures, position, S);\n if (namedCaptures !== undefined) push(replacerArgs, namedCaptures);\n var replacement = toString(apply(replaceValue, undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += stringSlice(S, nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + stringSlice(S, nextSourcePosition);\n }\n ];\n}, !REPLACE_SUPPORTS_NAMED_GROUPS || !REPLACE_KEEPS_$0 || REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE);\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar DOMTokenListPrototype = require('../internals/dom-token-list-prototype');\nvar forEach = require('../internals/array-for-each');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nvar handlePrototype = function (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n } catch (error) {\n CollectionPrototype.forEach = forEach;\n }\n};\n\nfor (var COLLECTION_NAME in DOMIterables) {\n if (DOMIterables[COLLECTION_NAME]) {\n handlePrototype(global[COLLECTION_NAME] && global[COLLECTION_NAME].prototype);\n }\n}\n\nhandlePrototype(DOMTokenListPrototype);\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar DOMTokenListPrototype = require('../internals/dom-token-list-prototype');\nvar ArrayIteratorMethods = require('../modules/es.array.iterator');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nvar handlePrototype = function (CollectionPrototype, COLLECTION_NAME) {\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n if (!CollectionPrototype[TO_STRING_TAG]) {\n createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);\n }\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n};\n\nfor (var COLLECTION_NAME in DOMIterables) {\n handlePrototype(global[COLLECTION_NAME] && global[COLLECTION_NAME].prototype, COLLECTION_NAME);\n}\n\nhandlePrototype(DOMTokenListPrototype, 'DOMTokenList');\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","// stopBodyScroll 方法依赖\nlet bodyEl = document.body\nlet windowTop = 0\nconst bodyElPosition = bodyEl.style.position\n\nconst archerUtil = {\n // 回到顶部\n backTop: function (event) {\n event.preventDefault()\n window.scrollTo({\n top: 0,\n behavior: 'smooth',\n })\n },\n\n // 获取元素在页面上相对左上角的位置\n getAbsPosition: function (e) {\n let x = e.offsetLeft,\n y = e.offsetTop\n\n let current = e.offsetParent\n while (current !== null) {\n x += current.offsetLeft\n y += current.offsetTop\n current = current.offsetParent\n }\n\n return {\n x: x,\n y: y,\n }\n },\n\n // 格式化日期\n dateFormater: function (date, fmt) {\n const o = {\n 'M+': date.getMonth() + 1, // 月份\n 'd+': date.getDate(), // 日\n 'h+': date.getHours(), // 小时\n 'm+': date.getMinutes(), // 分\n 's+': date.getSeconds(), // 秒\n 'q+': Math.floor((date.getMonth() + 3) / 3), // 季度\n S: date.getMilliseconds(), // 毫秒\n }\n if (/(y+)/.test(fmt)) {\n fmt = fmt.replace(\n RegExp.$1,\n String(date.getFullYear()).substr(4 - RegExp.$1.length)\n )\n }\n for (const k in o) {\n if (new RegExp('(' + k + ')').test(fmt)) {\n fmt = fmt.replace(\n RegExp.$1,\n RegExp.$1.length === 1\n ? o[k]\n : ('00' + o[k]).substr(String(o[k]).length)\n )\n }\n }\n return fmt\n },\n\n // 获取 1rem 对应的 px 值\n rem: () => {\n return parseInt($('html').css('font-size'), 10)\n },\n\n // 设置地址栏 hash\n setWindowHash: (hash) => {\n window.history.replaceState({}, '', `#/${hash}`)\n },\n\n // 读取地址栏 hash\n getWindowHash: () => {\n return window.location.hash.replace(/^#\\//, '#')\n },\n\n // rAF 的 ticking\n rafTick: function (ticking, updateFunc) {\n if (!ticking) {\n requestAnimationFrame(updateFunc)\n }\n ticking = true\n },\n\n // 固定 body\n // see: https://segmentfault.com/a/1190000012313337\n stopBodyScroll: function (isFixed) {\n if (isFixed) {\n windowTop = window.scrollY\n\n bodyEl.style.position = 'fixed'\n bodyEl.style.top = -windowTop + 'px'\n bodyEl.style.width = '100%'\n } else {\n bodyEl.style.position = bodyElPosition\n bodyEl.style.top = ''\n bodyEl.style.width = ''\n\n window.scrollTo(0, windowTop)\n }\n },\n\n // 函数节流\n throttle: function (func, wait, immediate = false) {\n let timer\n return function () {\n const args = arguments\n if (!timer) {\n if (immediate) {\n timer = setTimeout(() => {\n timer = undefined\n }, wait)\n func.apply(this, args)\n } else {\n timer = setTimeout(() => {\n timer = undefined\n func.apply(this, args)\n }, wait)\n }\n }\n }\n },\n\n // 函数防抖\n debounce: function (func, wait, immediate = false) {\n let timer\n return function () {\n const args = arguments\n\n timer && clearTimeout(timer)\n\n if (immediate) {\n !timer && func.apply(this, args)\n timer = setTimeout(() => {\n timer = undefined\n }, wait)\n } else {\n timer = setTimeout(() => {\n func.apply(this, args)\n }, wait)\n }\n }\n },\n}\n\nexport default archerUtil\n","import archerUtil from './util'\nlet prevHeight = 0\nlet throttleTocOnScroll\nconst $banner = $('.banner:first')\nlet statusTocOnclick = false\n\n// Banner in post page will occupy a certain amount of place.\n// Therefore, the scroll event should be subtracted from this occupancy.\nconst scrollOffsetHeight = $banner.height() + archerUtil.rem()\nconst calcAnchorLink = (heights, currHeight) => {\n for (let i = 0; i < heights.length; i++) {\n if (\n Math.abs(currHeight - heights[i]) <=\n scrollOffsetHeight + archerUtil.rem()\n ) {\n return i\n }\n }\n return -1\n}\n\n// Query toc headers absolute height\nfunction initTocLinksScrollTop(tocLinks) {\n return [...tocLinks].map((link) => {\n return archerUtil.getAbsPosition(link, true).y\n })\n}\n\nconst isPassingThrough = (currHeight, prevHeight, linkHeight) => {\n return (currHeight + 1 - linkHeight) * (prevHeight + 1 - linkHeight) <= 0\n}\n\nfunction calcScrollIntoScreenIndex(heights, prevHeight, currHeight) {\n const anchorLinkIndex = calcAnchorLink(heights, currHeight)\n if (anchorLinkIndex >= 0) {\n if (currHeight > prevHeight || statusTocOnclick) {\n return anchorLinkIndex\n } else {\n // if is scrolling up, select previous\n return anchorLinkIndex - 1 >= 0 ? anchorLinkIndex - 1 : 0\n }\n }\n}\n\n// hide all ol\nfunction hideAllOl(root) {\n ;[...root.querySelectorAll('ol')].forEach((li) => {\n hideItem(li)\n })\n}\n\n// back to default state\nfunction initFold(toc) {\n ;[...toc.children].forEach((child) => {\n hideAllOl(child)\n })\n ;[...toc.querySelectorAll('.toc-active')].forEach((child) => {\n child.classList.remove('toc-active')\n })\n}\n\nfunction resetFold(toc) {\n initFold(toc)\n}\n\nfunction hideItem(node) {\n node.style.display = 'none'\n}\n\nfunction showItem(node) {\n node.style.display = ''\n}\n\nfunction activeTocItem(node) {\n node.classList.add('toc-active')\n}\n\nfunction showAllChildren(node) {\n ;[...node.children].forEach((child) => {\n showItem(child)\n })\n}\n\nfunction spreadParentNodeOfTargetItem(tocItem) {\n let currNode = tocItem\n while (currNode && currNode.parentNode) {\n showAllChildren(currNode.parentNode)\n showAllChildren(currNode)\n currNode = currNode.parentNode\n if (currNode.classList.contains('toc')) {\n break\n }\n }\n}\n\nconst main = () => {\n const toc = document.querySelector('.toc')\n const $toc = $('.toc')\n const tocItems = document.querySelectorAll('.toc-item')\n if (!tocItems.length) {\n return\n }\n\n // tocItems, tocLinks, archorjsLinks and headers are in one-to-one correspondence\n const tocLinks = document.querySelectorAll('.toc-link')\n const archorjsLinks = document.querySelectorAll('.anchorjs-link')\n const headers = document.querySelectorAll(\n '.article-entry h1, h2, h3, h4, h5, h6'\n )\n\n initFold(toc)\n\n const initTocOnScroll = () => {\n // Get header links absolute height\n const headersHeights = initTocLinksScrollTop(headers)\n\n // Overide toc links on-click event\n for (let i = 0; i < tocLinks.length; i++) {\n const onclickScrollTop = headersHeights[i] - scrollOffsetHeight\n const onclickHeaderId = headers[i].id\n const tocOnclickFunction = function () {\n // Prevent scroll default event\n statusTocOnclick = true\n // Prevent header banner default event\n // See ./scroll.js\n window.preventPostPageBannerDefault = true\n $banner.addClass('banner-show')\n archerUtil.setWindowHash(onclickHeaderId)\n window.scrollTo({ top: onclickScrollTop })\n }\n tocLinks[i].onclick = () => {\n tocOnclickFunction()\n return false\n }\n if (archorjsLinks.length && archorjsLinks.length > i) {\n archorjsLinks[i].onclick = () => {\n tocOnclickFunction()\n return false\n }\n }\n }\n\n // Document on-scroll event\n const tocOnScroll = () => {\n const currHeight = $(document).scrollTop()\n const currHeightIndex = calcScrollIntoScreenIndex(\n headersHeights,\n prevHeight,\n currHeight\n )\n prevHeight = currHeight\n if (typeof currHeightIndex === 'undefined') {\n return\n }\n // spread, fold and active\n const currItem = tocItems[currHeightIndex]\n // 1. fold\n resetFold(toc)\n // 2. spread\n spreadParentNodeOfTargetItem(currItem)\n // 3. active\n if (currItem) {\n activeTocItem(currItem.querySelector('a'))\n }\n // 4. scroll toc\n const currItemOffsetTop = currItem?.offsetTop || undefined\n if (currItemOffsetTop) {\n $toc.scrollTop(currItemOffsetTop)\n }\n // 5. set url hash\n // Skip refresh hash when jump by clicking toc.\n // Prevent unexpected behavior.\n const headerHashId = headers[currHeightIndex]?.id || undefined\n if (!statusTocOnclick && headerHashId !== undefined) {\n archerUtil.setWindowHash(headerHashId)\n }\n statusTocOnclick = false\n }\n\n tocOnScroll()\n\n // Unbind existing on-scroll event\n if (throttleTocOnScroll) $(document).off('scroll', throttleTocOnScroll)\n // Bind document on-scroll event\n throttleTocOnScroll = archerUtil.throttle(tocOnScroll, 100, true)\n $(document).on('scroll', throttleTocOnScroll)\n }\n\n initTocOnScroll()\n\n // Header's absolute position would be changed when window is resized.\n $(window).on('resize', archerUtil.throttle(initTocOnScroll, 100, true))\n\n // Remove toc loading status\n $('.toc-wrapper').removeClass('toc-wrapper-loding')\n\n // Reload toc scroll events after loading all resources like images\n window.addEventListener('load', initTocOnScroll())\n}\n\nexport default main\n","export default function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","import toPropertyKey from \"./toPropertyKey.js\";\nexport default function _defineProperty(obj, key, value) {\n key = toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}","import defineProperty from \"./defineProperty.js\";\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n enumerableOnly && (symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n })), keys.push.apply(keys, symbols);\n }\n return keys;\n}\nexport default function _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = null != arguments[i] ? arguments[i] : {};\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n defineProperty(target, key, source[key]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}","export default function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);\n }\n}\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}","/*!\n * perfect-scrollbar v1.5.3\n * Copyright 2021 Hyunje Jun, MDBootstrap and Contributors\n * Licensed under MIT\n */\n\nfunction get(element) {\n return getComputedStyle(element);\n}\n\nfunction set(element, obj) {\n for (var key in obj) {\n var val = obj[key];\n if (typeof val === 'number') {\n val = val + \"px\";\n }\n element.style[key] = val;\n }\n return element;\n}\n\nfunction div(className) {\n var div = document.createElement('div');\n div.className = className;\n return div;\n}\n\nvar elMatches =\n typeof Element !== 'undefined' &&\n (Element.prototype.matches ||\n Element.prototype.webkitMatchesSelector ||\n Element.prototype.mozMatchesSelector ||\n Element.prototype.msMatchesSelector);\n\nfunction matches(element, query) {\n if (!elMatches) {\n throw new Error('No element matching method supported');\n }\n\n return elMatches.call(element, query);\n}\n\nfunction remove(element) {\n if (element.remove) {\n element.remove();\n } else {\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n }\n}\n\nfunction queryChildren(element, selector) {\n return Array.prototype.filter.call(element.children, function (child) { return matches(child, selector); }\n );\n}\n\nvar cls = {\n main: 'ps',\n rtl: 'ps__rtl',\n element: {\n thumb: function (x) { return (\"ps__thumb-\" + x); },\n rail: function (x) { return (\"ps__rail-\" + x); },\n consuming: 'ps__child--consume',\n },\n state: {\n focus: 'ps--focus',\n clicking: 'ps--clicking',\n active: function (x) { return (\"ps--active-\" + x); },\n scrolling: function (x) { return (\"ps--scrolling-\" + x); },\n },\n};\n\n/*\n * Helper methods\n */\nvar scrollingClassTimeout = { x: null, y: null };\n\nfunction addScrollingClass(i, x) {\n var classList = i.element.classList;\n var className = cls.state.scrolling(x);\n\n if (classList.contains(className)) {\n clearTimeout(scrollingClassTimeout[x]);\n } else {\n classList.add(className);\n }\n}\n\nfunction removeScrollingClass(i, x) {\n scrollingClassTimeout[x] = setTimeout(\n function () { return i.isAlive && i.element.classList.remove(cls.state.scrolling(x)); },\n i.settings.scrollingThreshold\n );\n}\n\nfunction setScrollingClassInstantly(i, x) {\n addScrollingClass(i, x);\n removeScrollingClass(i, x);\n}\n\nvar EventElement = function EventElement(element) {\n this.element = element;\n this.handlers = {};\n};\n\nvar prototypeAccessors = { isEmpty: { configurable: true } };\n\nEventElement.prototype.bind = function bind (eventName, handler) {\n if (typeof this.handlers[eventName] === 'undefined') {\n this.handlers[eventName] = [];\n }\n this.handlers[eventName].push(handler);\n this.element.addEventListener(eventName, handler, false);\n};\n\nEventElement.prototype.unbind = function unbind (eventName, target) {\n var this$1 = this;\n\n this.handlers[eventName] = this.handlers[eventName].filter(function (handler) {\n if (target && handler !== target) {\n return true;\n }\n this$1.element.removeEventListener(eventName, handler, false);\n return false;\n });\n};\n\nEventElement.prototype.unbindAll = function unbindAll () {\n for (var name in this.handlers) {\n this.unbind(name);\n }\n};\n\nprototypeAccessors.isEmpty.get = function () {\n var this$1 = this;\n\n return Object.keys(this.handlers).every(\n function (key) { return this$1.handlers[key].length === 0; }\n );\n};\n\nObject.defineProperties( EventElement.prototype, prototypeAccessors );\n\nvar EventManager = function EventManager() {\n this.eventElements = [];\n};\n\nEventManager.prototype.eventElement = function eventElement (element) {\n var ee = this.eventElements.filter(function (ee) { return ee.element === element; })[0];\n if (!ee) {\n ee = new EventElement(element);\n this.eventElements.push(ee);\n }\n return ee;\n};\n\nEventManager.prototype.bind = function bind (element, eventName, handler) {\n this.eventElement(element).bind(eventName, handler);\n};\n\nEventManager.prototype.unbind = function unbind (element, eventName, handler) {\n var ee = this.eventElement(element);\n ee.unbind(eventName, handler);\n\n if (ee.isEmpty) {\n // remove\n this.eventElements.splice(this.eventElements.indexOf(ee), 1);\n }\n};\n\nEventManager.prototype.unbindAll = function unbindAll () {\n this.eventElements.forEach(function (e) { return e.unbindAll(); });\n this.eventElements = [];\n};\n\nEventManager.prototype.once = function once (element, eventName, handler) {\n var ee = this.eventElement(element);\n var onceHandler = function (evt) {\n ee.unbind(eventName, onceHandler);\n handler(evt);\n };\n ee.bind(eventName, onceHandler);\n};\n\nfunction createEvent(name) {\n if (typeof window.CustomEvent === 'function') {\n return new CustomEvent(name);\n } else {\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(name, false, false, undefined);\n return evt;\n }\n}\n\nfunction processScrollDiff(\n i,\n axis,\n diff,\n useScrollingClass,\n forceFireReachEvent\n) {\n if ( useScrollingClass === void 0 ) useScrollingClass = true;\n if ( forceFireReachEvent === void 0 ) forceFireReachEvent = false;\n\n var fields;\n if (axis === 'top') {\n fields = [\n 'contentHeight',\n 'containerHeight',\n 'scrollTop',\n 'y',\n 'up',\n 'down' ];\n } else if (axis === 'left') {\n fields = [\n 'contentWidth',\n 'containerWidth',\n 'scrollLeft',\n 'x',\n 'left',\n 'right' ];\n } else {\n throw new Error('A proper axis should be provided');\n }\n\n processScrollDiff$1(i, diff, fields, useScrollingClass, forceFireReachEvent);\n}\n\nfunction processScrollDiff$1(\n i,\n diff,\n ref,\n useScrollingClass,\n forceFireReachEvent\n) {\n var contentHeight = ref[0];\n var containerHeight = ref[1];\n var scrollTop = ref[2];\n var y = ref[3];\n var up = ref[4];\n var down = ref[5];\n if ( useScrollingClass === void 0 ) useScrollingClass = true;\n if ( forceFireReachEvent === void 0 ) forceFireReachEvent = false;\n\n var element = i.element;\n\n // reset reach\n i.reach[y] = null;\n\n // 1 for subpixel rounding\n if (element[scrollTop] < 1) {\n i.reach[y] = 'start';\n }\n\n // 1 for subpixel rounding\n if (element[scrollTop] > i[contentHeight] - i[containerHeight] - 1) {\n i.reach[y] = 'end';\n }\n\n if (diff) {\n element.dispatchEvent(createEvent((\"ps-scroll-\" + y)));\n\n if (diff < 0) {\n element.dispatchEvent(createEvent((\"ps-scroll-\" + up)));\n } else if (diff > 0) {\n element.dispatchEvent(createEvent((\"ps-scroll-\" + down)));\n }\n\n if (useScrollingClass) {\n setScrollingClassInstantly(i, y);\n }\n }\n\n if (i.reach[y] && (diff || forceFireReachEvent)) {\n element.dispatchEvent(createEvent((\"ps-\" + y + \"-reach-\" + (i.reach[y]))));\n }\n}\n\nfunction toInt(x) {\n return parseInt(x, 10) || 0;\n}\n\nfunction isEditable(el) {\n return (\n matches(el, 'input,[contenteditable]') ||\n matches(el, 'select,[contenteditable]') ||\n matches(el, 'textarea,[contenteditable]') ||\n matches(el, 'button,[contenteditable]')\n );\n}\n\nfunction outerWidth(element) {\n var styles = get(element);\n return (\n toInt(styles.width) +\n toInt(styles.paddingLeft) +\n toInt(styles.paddingRight) +\n toInt(styles.borderLeftWidth) +\n toInt(styles.borderRightWidth)\n );\n}\n\nvar env = {\n isWebKit:\n typeof document !== 'undefined' &&\n 'WebkitAppearance' in document.documentElement.style,\n supportsTouch:\n typeof window !== 'undefined' &&\n ('ontouchstart' in window ||\n ('maxTouchPoints' in window.navigator &&\n window.navigator.maxTouchPoints > 0) ||\n (window.DocumentTouch && document instanceof window.DocumentTouch)),\n supportsIePointer:\n typeof navigator !== 'undefined' && navigator.msMaxTouchPoints,\n isChrome:\n typeof navigator !== 'undefined' &&\n /Chrome/i.test(navigator && navigator.userAgent),\n};\n\nfunction updateGeometry(i) {\n var element = i.element;\n var roundedScrollTop = Math.floor(element.scrollTop);\n var rect = element.getBoundingClientRect();\n\n i.containerWidth = Math.round(rect.width);\n i.containerHeight = Math.round(rect.height);\n\n i.contentWidth = element.scrollWidth;\n i.contentHeight = element.scrollHeight;\n\n if (!element.contains(i.scrollbarXRail)) {\n // clean up and append\n queryChildren(element, cls.element.rail('x')).forEach(function (el) { return remove(el); }\n );\n element.appendChild(i.scrollbarXRail);\n }\n if (!element.contains(i.scrollbarYRail)) {\n // clean up and append\n queryChildren(element, cls.element.rail('y')).forEach(function (el) { return remove(el); }\n );\n element.appendChild(i.scrollbarYRail);\n }\n\n if (\n !i.settings.suppressScrollX &&\n i.containerWidth + i.settings.scrollXMarginOffset < i.contentWidth\n ) {\n i.scrollbarXActive = true;\n i.railXWidth = i.containerWidth - i.railXMarginWidth;\n i.railXRatio = i.containerWidth / i.railXWidth;\n i.scrollbarXWidth = getThumbSize(\n i,\n toInt((i.railXWidth * i.containerWidth) / i.contentWidth)\n );\n i.scrollbarXLeft = toInt(\n ((i.negativeScrollAdjustment + element.scrollLeft) *\n (i.railXWidth - i.scrollbarXWidth)) /\n (i.contentWidth - i.containerWidth)\n );\n } else {\n i.scrollbarXActive = false;\n }\n\n if (\n !i.settings.suppressScrollY &&\n i.containerHeight + i.settings.scrollYMarginOffset < i.contentHeight\n ) {\n i.scrollbarYActive = true;\n i.railYHeight = i.containerHeight - i.railYMarginHeight;\n i.railYRatio = i.containerHeight / i.railYHeight;\n i.scrollbarYHeight = getThumbSize(\n i,\n toInt((i.railYHeight * i.containerHeight) / i.contentHeight)\n );\n i.scrollbarYTop = toInt(\n (roundedScrollTop * (i.railYHeight - i.scrollbarYHeight)) /\n (i.contentHeight - i.containerHeight)\n );\n } else {\n i.scrollbarYActive = false;\n }\n\n if (i.scrollbarXLeft >= i.railXWidth - i.scrollbarXWidth) {\n i.scrollbarXLeft = i.railXWidth - i.scrollbarXWidth;\n }\n if (i.scrollbarYTop >= i.railYHeight - i.scrollbarYHeight) {\n i.scrollbarYTop = i.railYHeight - i.scrollbarYHeight;\n }\n\n updateCss(element, i);\n\n if (i.scrollbarXActive) {\n element.classList.add(cls.state.active('x'));\n } else {\n element.classList.remove(cls.state.active('x'));\n i.scrollbarXWidth = 0;\n i.scrollbarXLeft = 0;\n element.scrollLeft = i.isRtl === true ? i.contentWidth : 0;\n }\n if (i.scrollbarYActive) {\n element.classList.add(cls.state.active('y'));\n } else {\n element.classList.remove(cls.state.active('y'));\n i.scrollbarYHeight = 0;\n i.scrollbarYTop = 0;\n element.scrollTop = 0;\n }\n}\n\nfunction getThumbSize(i, thumbSize) {\n if (i.settings.minScrollbarLength) {\n thumbSize = Math.max(thumbSize, i.settings.minScrollbarLength);\n }\n if (i.settings.maxScrollbarLength) {\n thumbSize = Math.min(thumbSize, i.settings.maxScrollbarLength);\n }\n return thumbSize;\n}\n\nfunction updateCss(element, i) {\n var xRailOffset = { width: i.railXWidth };\n var roundedScrollTop = Math.floor(element.scrollTop);\n\n if (i.isRtl) {\n xRailOffset.left =\n i.negativeScrollAdjustment +\n element.scrollLeft +\n i.containerWidth -\n i.contentWidth;\n } else {\n xRailOffset.left = element.scrollLeft;\n }\n if (i.isScrollbarXUsingBottom) {\n xRailOffset.bottom = i.scrollbarXBottom - roundedScrollTop;\n } else {\n xRailOffset.top = i.scrollbarXTop + roundedScrollTop;\n }\n set(i.scrollbarXRail, xRailOffset);\n\n var yRailOffset = { top: roundedScrollTop, height: i.railYHeight };\n if (i.isScrollbarYUsingRight) {\n if (i.isRtl) {\n yRailOffset.right =\n i.contentWidth -\n (i.negativeScrollAdjustment + element.scrollLeft) -\n i.scrollbarYRight -\n i.scrollbarYOuterWidth -\n 9;\n } else {\n yRailOffset.right = i.scrollbarYRight - element.scrollLeft;\n }\n } else {\n if (i.isRtl) {\n yRailOffset.left =\n i.negativeScrollAdjustment +\n element.scrollLeft +\n i.containerWidth * 2 -\n i.contentWidth -\n i.scrollbarYLeft -\n i.scrollbarYOuterWidth;\n } else {\n yRailOffset.left = i.scrollbarYLeft + element.scrollLeft;\n }\n }\n set(i.scrollbarYRail, yRailOffset);\n\n set(i.scrollbarX, {\n left: i.scrollbarXLeft,\n width: i.scrollbarXWidth - i.railBorderXWidth,\n });\n set(i.scrollbarY, {\n top: i.scrollbarYTop,\n height: i.scrollbarYHeight - i.railBorderYWidth,\n });\n}\n\nfunction clickRail(i) {\n var element = i.element;\n\n i.event.bind(i.scrollbarY, 'mousedown', function (e) { return e.stopPropagation(); });\n i.event.bind(i.scrollbarYRail, 'mousedown', function (e) {\n var positionTop =\n e.pageY -\n window.pageYOffset -\n i.scrollbarYRail.getBoundingClientRect().top;\n var direction = positionTop > i.scrollbarYTop ? 1 : -1;\n\n i.element.scrollTop += direction * i.containerHeight;\n updateGeometry(i);\n\n e.stopPropagation();\n });\n\n i.event.bind(i.scrollbarX, 'mousedown', function (e) { return e.stopPropagation(); });\n i.event.bind(i.scrollbarXRail, 'mousedown', function (e) {\n var positionLeft =\n e.pageX -\n window.pageXOffset -\n i.scrollbarXRail.getBoundingClientRect().left;\n var direction = positionLeft > i.scrollbarXLeft ? 1 : -1;\n\n i.element.scrollLeft += direction * i.containerWidth;\n updateGeometry(i);\n\n e.stopPropagation();\n });\n}\n\nfunction dragThumb(i) {\n bindMouseScrollHandler(i, [\n 'containerWidth',\n 'contentWidth',\n 'pageX',\n 'railXWidth',\n 'scrollbarX',\n 'scrollbarXWidth',\n 'scrollLeft',\n 'x',\n 'scrollbarXRail' ]);\n bindMouseScrollHandler(i, [\n 'containerHeight',\n 'contentHeight',\n 'pageY',\n 'railYHeight',\n 'scrollbarY',\n 'scrollbarYHeight',\n 'scrollTop',\n 'y',\n 'scrollbarYRail' ]);\n}\n\nfunction bindMouseScrollHandler(\n i,\n ref\n) {\n var containerHeight = ref[0];\n var contentHeight = ref[1];\n var pageY = ref[2];\n var railYHeight = ref[3];\n var scrollbarY = ref[4];\n var scrollbarYHeight = ref[5];\n var scrollTop = ref[6];\n var y = ref[7];\n var scrollbarYRail = ref[8];\n\n var element = i.element;\n\n var startingScrollTop = null;\n var startingMousePageY = null;\n var scrollBy = null;\n\n function mouseMoveHandler(e) {\n if (e.touches && e.touches[0]) {\n e[pageY] = e.touches[0].pageY;\n }\n element[scrollTop] =\n startingScrollTop + scrollBy * (e[pageY] - startingMousePageY);\n addScrollingClass(i, y);\n updateGeometry(i);\n\n e.stopPropagation();\n if (e.type.startsWith('touch') && e.changedTouches.length > 1) {\n e.preventDefault();\n }\n }\n\n function mouseUpHandler() {\n removeScrollingClass(i, y);\n i[scrollbarYRail].classList.remove(cls.state.clicking);\n i.event.unbind(i.ownerDocument, 'mousemove', mouseMoveHandler);\n }\n\n function bindMoves(e, touchMode) {\n startingScrollTop = element[scrollTop];\n if (touchMode && e.touches) {\n e[pageY] = e.touches[0].pageY;\n }\n startingMousePageY = e[pageY];\n scrollBy =\n (i[contentHeight] - i[containerHeight]) /\n (i[railYHeight] - i[scrollbarYHeight]);\n if (!touchMode) {\n i.event.bind(i.ownerDocument, 'mousemove', mouseMoveHandler);\n i.event.once(i.ownerDocument, 'mouseup', mouseUpHandler);\n e.preventDefault();\n } else {\n i.event.bind(i.ownerDocument, 'touchmove', mouseMoveHandler);\n }\n\n i[scrollbarYRail].classList.add(cls.state.clicking);\n\n e.stopPropagation();\n }\n\n i.event.bind(i[scrollbarY], 'mousedown', function (e) {\n bindMoves(e);\n });\n i.event.bind(i[scrollbarY], 'touchstart', function (e) {\n bindMoves(e, true);\n });\n}\n\nfunction keyboard(i) {\n var element = i.element;\n\n var elementHovered = function () { return matches(element, ':hover'); };\n var scrollbarFocused = function () { return matches(i.scrollbarX, ':focus') || matches(i.scrollbarY, ':focus'); };\n\n function shouldPreventDefault(deltaX, deltaY) {\n var scrollTop = Math.floor(element.scrollTop);\n if (deltaX === 0) {\n if (!i.scrollbarYActive) {\n return false;\n }\n if (\n (scrollTop === 0 && deltaY > 0) ||\n (scrollTop >= i.contentHeight - i.containerHeight && deltaY < 0)\n ) {\n return !i.settings.wheelPropagation;\n }\n }\n\n var scrollLeft = element.scrollLeft;\n if (deltaY === 0) {\n if (!i.scrollbarXActive) {\n return false;\n }\n if (\n (scrollLeft === 0 && deltaX < 0) ||\n (scrollLeft >= i.contentWidth - i.containerWidth && deltaX > 0)\n ) {\n return !i.settings.wheelPropagation;\n }\n }\n return true;\n }\n\n i.event.bind(i.ownerDocument, 'keydown', function (e) {\n if (\n (e.isDefaultPrevented && e.isDefaultPrevented()) ||\n e.defaultPrevented\n ) {\n return;\n }\n\n if (!elementHovered() && !scrollbarFocused()) {\n return;\n }\n\n var activeElement = document.activeElement\n ? document.activeElement\n : i.ownerDocument.activeElement;\n if (activeElement) {\n if (activeElement.tagName === 'IFRAME') {\n activeElement = activeElement.contentDocument.activeElement;\n } else {\n // go deeper if element is a webcomponent\n while (activeElement.shadowRoot) {\n activeElement = activeElement.shadowRoot.activeElement;\n }\n }\n if (isEditable(activeElement)) {\n return;\n }\n }\n\n var deltaX = 0;\n var deltaY = 0;\n\n switch (e.which) {\n case 37: // left\n if (e.metaKey) {\n deltaX = -i.contentWidth;\n } else if (e.altKey) {\n deltaX = -i.containerWidth;\n } else {\n deltaX = -30;\n }\n break;\n case 38: // up\n if (e.metaKey) {\n deltaY = i.contentHeight;\n } else if (e.altKey) {\n deltaY = i.containerHeight;\n } else {\n deltaY = 30;\n }\n break;\n case 39: // right\n if (e.metaKey) {\n deltaX = i.contentWidth;\n } else if (e.altKey) {\n deltaX = i.containerWidth;\n } else {\n deltaX = 30;\n }\n break;\n case 40: // down\n if (e.metaKey) {\n deltaY = -i.contentHeight;\n } else if (e.altKey) {\n deltaY = -i.containerHeight;\n } else {\n deltaY = -30;\n }\n break;\n case 32: // space bar\n if (e.shiftKey) {\n deltaY = i.containerHeight;\n } else {\n deltaY = -i.containerHeight;\n }\n break;\n case 33: // page up\n deltaY = i.containerHeight;\n break;\n case 34: // page down\n deltaY = -i.containerHeight;\n break;\n case 36: // home\n deltaY = i.contentHeight;\n break;\n case 35: // end\n deltaY = -i.contentHeight;\n break;\n default:\n return;\n }\n\n if (i.settings.suppressScrollX && deltaX !== 0) {\n return;\n }\n if (i.settings.suppressScrollY && deltaY !== 0) {\n return;\n }\n\n element.scrollTop -= deltaY;\n element.scrollLeft += deltaX;\n updateGeometry(i);\n\n if (shouldPreventDefault(deltaX, deltaY)) {\n e.preventDefault();\n }\n });\n}\n\nfunction wheel(i) {\n var element = i.element;\n\n function shouldPreventDefault(deltaX, deltaY) {\n var roundedScrollTop = Math.floor(element.scrollTop);\n var isTop = element.scrollTop === 0;\n var isBottom =\n roundedScrollTop + element.offsetHeight === element.scrollHeight;\n var isLeft = element.scrollLeft === 0;\n var isRight =\n element.scrollLeft + element.offsetWidth === element.scrollWidth;\n\n var hitsBound;\n\n // pick axis with primary direction\n if (Math.abs(deltaY) > Math.abs(deltaX)) {\n hitsBound = isTop || isBottom;\n } else {\n hitsBound = isLeft || isRight;\n }\n\n return hitsBound ? !i.settings.wheelPropagation : true;\n }\n\n function getDeltaFromEvent(e) {\n var deltaX = e.deltaX;\n var deltaY = -1 * e.deltaY;\n\n if (typeof deltaX === 'undefined' || typeof deltaY === 'undefined') {\n // OS X Safari\n deltaX = (-1 * e.wheelDeltaX) / 6;\n deltaY = e.wheelDeltaY / 6;\n }\n\n if (e.deltaMode && e.deltaMode === 1) {\n // Firefox in deltaMode 1: Line scrolling\n deltaX *= 10;\n deltaY *= 10;\n }\n\n if (deltaX !== deltaX && deltaY !== deltaY /* NaN checks */) {\n // IE in some mouse drivers\n deltaX = 0;\n deltaY = e.wheelDelta;\n }\n\n if (e.shiftKey) {\n // reverse axis with shift key\n return [-deltaY, -deltaX];\n }\n return [deltaX, deltaY];\n }\n\n function shouldBeConsumedByChild(target, deltaX, deltaY) {\n // FIXME: this is a workaround for