Linux 归档、压缩

归档、压缩

tar

多个文件保存进行归档、压缩

gzip

压缩、解压缩gzip文件

gunzip

解压缩gzip文件

zcmp

调用diff比较gzip压缩文件

unzip

解压缩zip文件

zip

压缩zip文件

zcat

查看zip压缩文件

zless

查看zip压缩文件

zipinfo

列出zip文件相关详细信息

zipsplit

拆分zip文件

zipgrep

在zip压缩文件中搜索指定字符串、模式

zmore

查看gzip/zip/compress压缩文件

rpm2cpio

将rpm包转变为cpio格式文件,然后可以用cpio解压

1
$ rpm2cpio rpm_pkg | cpio -div

Grub

Grub

/etc/sysconfig/grub

GRUB配置文件,实际上是/etc/default/grub的软连接

系统日志

/var/log

  • bootstrap.log:系统引导相关信息
  • cron:系统调度执行信息
  • dmesg:内核启动时信息,包括硬件、文件系统
  • maillog:邮件服务器信息
  • message:系统运行过程相关信息,包括IO、网络
  • secure:系统安全信息

Linux 远程工具

远程连接服务器

ssh

ssh:ssh登陆服务器

1
2
ssh <user_name>@<host> [-p <port>] [-i <private_key>]
[-F <config_file>]
  • 参数
    • -F:指定配置文件,简化命令,缺省~/.ssh/config
      • 有时会覆盖其余配置,可以指定-F /dev/null避免
    • -p:指定端口
    • -i:指定使用的私钥
    • -T:测试连接

ssh-keygen

ssh-keygen:生成ssh密钥

1
2
3
4
 # 生成位长为4096的RSA密钥
$ ssh-keygen -t rsa -b 4096 -C "xyy15926@163.com"
# 更改现有私钥密钥
$ ssh-keygen -p [-f keyfile] [-m format] [-N new_pwd] [-p old_pwd]
  • 参数

    • -t [dsa|ecdsa|ecdsa-sk|ed25519|ed25519-sk|ras]: 生成密钥类型
    • -f <output_keyfile>:密钥保存文件
    • -b <bits>:密钥位数
    • -C <comment>
    • -p:修改现有密钥密码
  • 在生成密钥时可以设置密钥,避免计算机访问权限被获取后密钥 被用于访问其他系统

    • 设置有密钥的私钥每次使用都需要输入密码
    • ssh-agent可以用于管理私钥密码,将私钥添加给 ssh-agent无需每次输入密码

ssh-add

ssh-add:管理ssh-agent代理密钥

1
2
 # 缺省将`$HOME/.ssh/id_rsa`私钥添加至`ssh-agent`
$ ssh-add <keyfile>
  • 参数
    • -l:查看代理中私钥
    • -L:查看代理中私钥对应公钥
    • -d <keyfile>:移除指定私钥
    • -D:移除所有私钥
    • -x/-X:锁定/解锁ssh-agent(需要设置密码)
    • -t <seconds>:密钥时限

ssh-agent

ssh-agent:控制和保存公钥验证所使用的私钥程序

  • 参数

    • -k:关闭当前ssh-agent进程
  • 启动方式

    1
    2
    3
    4
    5
    # 创建默认子shell,在子shell中运行`ssh-agent`
    # 会自动进入子shell中,退出子shell则`ssh-agent`关闭
    $ ssh-agent $SHELL
    # 启动后台`ssh-agent`进程,需手动关闭`ssh-agent`进程
    $ eval `ssh-agent`
  • 说明

    • ssh-agent添加私钥需要输入私钥密码 (无密码私钥无管理必要)
    • ssh-agent不会默认启动,应是每次需要大量使用私钥 前启动、添加私钥,然后关闭

/etc/init.d/sshd

sshd:ssh连接的服务器守护程序(进程)

1
2
3
4
$ sudo systemctl start sshd
# 使用`systemctl`启动
$ /etc/init.d/sshd restart
# 直接启动进程

scp

scp:secure cp,安全传输(cp)文件

  • 本机到远程

    1
    $ scp /path/to/file user_name@host:/path/to/dest
  • 远程到本机

    1
    $ scp user_name@host:/path/to/file /path/to/dest
    • 这个命令应该在本机上使用,不是ssh环境下
    • ssh环境下使用命令表示在远程主机上操作
    • 而本机host一般是未知的(不是localhost)
  • 远程到远程

rsync

实现本地主机、远程主机的文本双向同步

同步两种模式

同步过程由两部分模式组成

  • 决定哪些文件需要同步的检查模式

    • 默认情况下,rsync使用quick check算法快速检查 源文件、目标文件大小、mtime是否一致,不一致则 需要传输
    • 也可以通过指定选项改变检查模式
  • 文件同步时的同步模式:文件确定被同步后,在同步发生 之前需要做哪些额外工作

    • 是否删除目标主机上比源主机多的文件
    • 是否要先备份已经存在的目标文件
    • 是否追踪链接文件

工作方式

  • 本地文件系统同步:本质是管道通信

    1
    $ rsync [option..] src... [dest]
  • 本地主机使用远程shell和远程主机通信

    1
    2
    $ rsync [option...] [user@]host:src... [dest]
    $ rsync [option...] src... [user@]host:dest
    • 本质上是管道通信
  • 本地主机通过socket连接远程主机的rsync

    1
    2
    3
    4
    $ rsync [option...] rsync://[user@]host[:port]/src... dest
    $ rsync [option...] [user@]host::src... [dest]
    $ rsync [option...] src... rsync://[user@]host[:port]/dest
    $ rsync [option...] src... [user@]host::dest
    • 需要远主机运行rsync服务监听端口,等待客户端连接
  • 通过远程shell临时派生rsync daemon,仅用于临时读取daemon 配置文件,同步完成后守护进程结束

    • 语法同shell远程主机通信,指定--rsh/-e选项

参数说明

  • 可以有多个源文件路径,最后一个是目标文件路径
  • 如果只有一个路径参数,则类似于ls -l列出目录
  • 注意:如果原路径是目录
    • /结尾表示目录中文件,不包括目录本身
    • 不以/结尾包括目录本身

常用选项

同步模式选项
  • v/-vvvv:显示详细/更详细信息
  • p/--partial --progress:显示进度
  • -n/--dry-run:测传传输
  • -a/--archive:归档模式,递归传输并保持文件属性
  • -r/--recursive:递归至目录
  • -t/--times:保持mtime属性
    • 建议任何时候都使用,否则目标文件mtime设置为系统时间
  • -o/--owner:保持属主
  • -g/--group:保持group
  • -p/--perms:保持权限(不包括特殊权限)
  • -D/--device --specials:拷贝设备文件、特殊文件
  • -l/--links:如果目标是软链接文,拷贝链接而不是文件
  • z:传输时压缩

  • w/--whole-file:使用全量传输

    • 网络带宽高于磁盘带宽时,此选项更高效
  • R/--relative:使用相对路径,即在目标中创建源中指定 的相对路径

    1
    2
    3
    $ rsync -R -r /var/./log/anaconda /tmp
    # 将会在目标创建`/tmp/log/anaconda`
    # `.`是将绝对路径转换为相对路径,其后的路径才会创建
  • --delete:以源为主,对DEST进行同步,多删、少补

  • -b/--backup:对目标上已经存在文件做备份的
    • 备份文件名使用~做后缀
  • --backup-dir:指定备份文件保存路径,不指定为同一目录
  • --remove-source-file:删除源中已成功传输文件
连接
  • --port:连接daemon时端口号,默认873
  • --password-file:daemon模式时的密码文件
    • 可以从中读取密码文件实现非交互式
    • 是rsync模块认证密码,不是shell认证密码
  • -e:指定所需要的远程shell程序,默认ssh
    1
    $ rsync -e "ssh -p 22 -o StrictHostKeyChecking=no" /etc/fstab
  • --rsh:使用rsync deamon进行同步
检查模式选项
  • --size-only:只检查文件大小,忽略mtime
  • -u/--update:进源mtime比已存在文件mtime新才拷贝
  • -d/--dirs:以不递归方式拷贝目录本身(不目录中内容)
  • --max-size:传输最大文件大小,可以使用单位后缀
  • --min-size:传输的最小文件大小
  • --exclude:指定派出规则排除不需要传输的文件
  • --existing:只更新目标端已存在文件,不存在不传输
  • --ignore-existing:只更新在目标段不存在文件

SSH

/etc/ssh/sshd_config

全局系统ssh配置

1
2
3
4
5
6
7
8
RSAAuthentication
# 去掉注释启用RSA认证
PubkeyAuthentication yes
# 启用公私钥配对认证方式
AuthorizedKeyFile .ssh/authorized_keys
# 设置被认证的公钥存放文件
# 默认为`~/.ssh/authorized_keys`中
# 将其他主机公钥写入其中,即可从其使用密钥认证免密访问

~/.ssh

authorized_keys

/etc/.ssh/sshd_config中默认的存储其他主机公钥的文件,

  • 使用在其中的公钥可以使用公钥登陆,无需密码
  • 必须设置只有root用户有更改权限有效,否则报错
1
---pubkey---
id_rsa.pub

生成公钥

config

ssh访问远程主机配置

  • 每条配置对应一个ssh连接,配置后可以使用link_name直接 连接
1
2
3
4
5
6
7
Host <link_name>
HostName <host>
User <user_name>
Port <port>
IdentityFile <private_key>
IdentitiesOnly yes
PreferredAuthentications publickey
  • 默认私钥文件为:~/.ssh/id_rsa,可以指定特定私钥
  • 此文件中配置是ssh协议参数封装,适合任何可以使用ssh协议 场合:sshgitscp

CMD说明

CMD说明

CMD字体要求

  • CMD/Powershell对字体要求比较严格

    • 等宽字体
    • 不能为斜体字体
    • 不能有A或C负空间
    • 若是TrueType字体,则必须是FF_MODERN
    • 若不是TrueType字体,则必须是OEM_CHARSET
  • 对于CJK(亚洲字体),还有额外附加条件

    • 若不是TrueType字体,字体名必须是Terminal
    • 若是TrueType字体,必须使用亚洲语言字符集
    • 在字体元信息里声明支持CP936

PowerPoint 技巧

插入元素

插入网页

  • WebView加载项:可以在ppt应用市场中获取

    • 只支持https页面
      • 本地页面都不支持
      • 尝试自建https服务器(自签发证书)失败
    • 可以在编辑状态查看页面效果
    • 在OFFICE2010及以前不可用
  • Microsoft Web Browser控件

    • 调用IE渲染页面,因此网页对IE的兼容性很重要
    • 控件不会自动加载网页,需要通过VB通过触发事件调用其 Navigate2方法加载网页,所以只有在ppt播放页面才能 看到实际效果
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      // 页面切换事件
      // 注意不要`Private Sub`,否则事件不会被触发
      // 若想手动触发可以使用button控件的`CommandButton<X>_Click`事件
      Sub OnSlideShowPageChange()
      Dim FileName As String
      FileName = "<FILENAME>"
      // `WebBrowser1`:控件名称,唯一(单个slide内)标识控件
      // `ActivePresentation.PATH`:当前工作目录(未保存文件返回空),
      // 浏览器默认`http://`协议
      // `Navigate`方法可能会无法加载
      WebBrowser1.Navigate2(ActivePresentation.PATH + "/" + "<FILENAME>")
      End Sub

Nginx 使用、配置

配置

  • 配置文件夹为/etc/nginx

基本配置

nginx.conf

nginx.conf:Nginx主配置文件,包含“全部配置”

  • 默认include

    • modules-enabled/*.conf:已启用模块
    • mime.types:代理文件类型
    • conf.d/*.conf:服务器设置
    • sites-enabled/*:已启用站点
  • user表示启动nginx进程的用户

    • 键值默认为www-data
    • 可修改为其他用户,使nginx具有访问某些文件的权限
    • 若是在nginx启动之后修改,需修改/var/log/nginx中 log文件的属主,否则无法正常log

http服务器设置

1
2
3
4
5
6
7
8
9
10
server{
listen 8080;
server_name localhost;
location / {
root /home/xyy15926/Code;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
}
  • root:需要nginx进程可访问,否则403 Forbidden
  • autoindex:自动为文件生成目录
    • 若目录设置index index.XXX,不设置autoindex访问 目录则会403 Forbidden

https服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server{
listen 443 ssl;
server_name localhost;
ssl_certificate /home/xyy15926/Code/home_config/nginx/localhost.crt;
ssl_certificate_key /home/xyy15926/Code/home_config/nginx/localhost.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
root /home/xyy15926/Code/statics;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
}
  • ssl_certificatessl_certificate_key:SSL证书、私钥

    1
    2
    3
    4
    5
    6
    # 个人签发https证书,个人一般不会是受信任机构,所以还需要
    # 将证书添加进受信任机构(但是windows下有些有问题)
    openssl req -x509 -out localhost.crt -keyout localhost.key \
    -newkey rsa:2048 -nodes -sha256 \
    -subj '/CN=localhost' -extensions EXT -config <( \
    printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")

运行

1
2
3
 # Nginx启动、重启动
$ /etc/init.d/nginx start
$ /etc/init.d/nginx restart

Excel技巧

EXCEL密码破解

VBAProject密码

  • vbaProject.bin中密码对应字段

    • DPB:当前已存在密码,后跟加密密码值
  • xls:97-03格式表格是RAR格式压缩文件

    • 解压之后再次压缩一般无法正常打开,应该是有特殊的压缩 规则
    • 可以直接用编辑器打开、修改整个文件,但要注意以二进制 格式打开
  • xlsm:07之后带宏表格是ZIP压缩文件

    • 解压之后再次zip打包也无法正常打开,但是zip格式可以 直接替换其中文件,所以可以直接修改单个文件
    • vim对zip格式文件处理类型文件夹,所以使用vim二进制打开 可以修改其中单个文件

修改二进制文件

  • 处理方法:将密码对应字段“无效”

    • 需要保持文件前后大小不改变
    • 密码字段无效化
  • “删除”密码字段

    • DPB字段替换为等长其他名称
      • 密码无法被正常识别
      • 文件大小没有改变,仅字符被替换
    • 再次打开文件,启用宏会报错
      • 不断点击确认之后即可查看vba工程
      • 为vba工程设置新密码,覆盖替换后错误字段,保存 可得已知密码文件
        • 右键VBAProject
        • 工程属性
        • 保护
        • 查看工程属性密码:修改为新密码即可
  • 替换密码字段

    • DPB后密码值替换为其他值
      • 为保证文件大小不变
        • 若新密码较短需要用0填充不足部分
        • 较原始密码长则无需额外操作
    • 打开文件则可以使用已知密码查看vba工程
1
2
3
4
5
6
7
8
9
10
11
 # 二进制打开文件,否则vim会做某些处理,损坏文件
$ vim -b <file>

# 调用xxd转换字符格式为16进制
# 可看到16进制、字符对应格式
# 仅修改左侧16进制有效,修改右侧字符表示不影响文件
# 内容
$ !%xxd

# 16进制转换回原始表示
$ !%xxd -r

VBA脚本穷举密码

  • xls格式:打开VBA编辑器执行代码

    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
    '移除VBA编码保护
    Sub MoveProtect()
    Dim FileName As String
    FileName = Application.GetOpenFilename("Excel文件(*.xls & *.xla),*.xls;*.xla", , "VBA破解")
    If FileName = CStr(False) Then
    Exit Sub
    Else
    VBAPassword FileName, False
    End If
    End Sub

    '设置VBA编码保护
    Sub SetProtect()
    Dim FileName As String
    FileName = Application.GetOpenFilename("Excel文件(*.xls & *.xla),*.xls;*.xla", , "VBA破解")
    If FileName = CStr(False) Then
    Exit Sub
    Else
    VBAPassword FileName, True
    End If
    End Sub

    Private Function VBAPassword(FileName As String, Optional Protect As Boolean = False)
    If Dir(FileName) = "" Then
    Exit Function
    Else
    FileCopy FileName, FileName & ".bak"
    End If

    Dim GetData As String * 5
    Open FileName For Binary As #1
    Dim CMGs As Long
    Dim DPBo As Long
    For i = 1 To LOF(1)
    Get #1, i, GetData
    If GetData = "CMG=""" Then CMGs = i
    If GetData = "[Host" Then DPBo = i - 2: Exit For
    Next
    If CMGs = 0 Then
    MsgBox "请先对VBA编码设置一个保护密码...", 32, "提示"
    Exit Function
    End If
    If Protect = False Then
    Dim St As String * 2
    Dim s20 As String * 1
    '取得一个0D0A十六进制字串
    Get #1, CMGs - 2, St
    '取得一个20十六制字串
    Get #1, DPBo + 16, s20
    '替换加密部份机码
    For i = CMGs To DPBo Step 2
    Put #1, i, St
    Next
    '加入不配对符号
    If (DPBo - CMGs) Mod 2 <> 0 Then
    Put #1, DPBo + 1, s20
    End If
    MsgBox "文件解密成功......", 32, "提示"
    Else
    Dim MMs As String * 5
    MMs = "DPB="""
    Put #1, CMGs, MMs
    MsgBox "对文件特殊加密成功......", 32, "提示"
    End If
    Close #1
    End Function

Sheet保护密码

VBA脚本

  • xlsx:打开VBA编辑器执行代码

    1
    2
    3
    4
    5
    6
    7
    Sub pj()
    Dim sht As Worksheet
    For Each sht In Worksheets
    sht.Protect AllowFiltering:=True
    sht.Unprotect
    Next
    End Sub
  • xls:打开VBA编辑器执行代码

    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    Public Sub AllInternalPasswords()
    ' Breaks worksheet and workbook structure passwords. Bob McCormick
    ' probably originator of base code algorithm modified for coverage
    ' of workbook structure / windows passwords and for multiple passwords
    '
    ' Norman Harker and JE McGimpsey 27-Dec-2002 (Version 1.1)
    ' Modified 2003-Apr-04 by JEM: All msgs to constants, and
    ' eliminate one Exit Sub (Version 1.1.1)
    ' Reveals hashed passwords NOT original passwords
    Const DBLSPACE As String = vbNewLine & vbNewLine
    Const AUTHORS As String = DBLSPACE & vbNewLine & _
    "Adapted from Bob McCormick base code by" & _
    "Norman Harker and JE McGimpsey"
    Const HEADER As String = "AllInternalPasswords User Message"
    Const VERSION As String = DBLSPACE & "Version 1.1.1 2003-Apr-04"
    Const REPBACK As String = DBLSPACE & "Please report failure " & _
    "to the microsoft.public.excel.programming newsgroup."
    Const ALLCLEAR As String = DBLSPACE & "The workbook should " & _
    "now be free of all password protection, so make sure you:" & _
    DBLSPACE & "SAVE IT NOW!" & DBLSPACE & "and also" & _
    DBLSPACE & "BACKUP!, BACKUP!!, BACKUP!!!" & _
    DBLSPACE & "Also, remember that the password was " & _
    "put there for a reason. Don't stuff up crucial formulas " & _
    "or data." & DBLSPACE & "Access and use of some data " & _
    "may be an offense. If in doubt, don't."
    Const MSGNOPWORDS1 As String = "There were no passwords on " & _
    "sheets, or workbook structure or windows." & AUTHORS & VERSION
    Const MSGNOPWORDS2 As String = "There was no protection to " & _
    "workbook structure or windows." & DBLSPACE & _
    "Proceeding to unprotect sheets." & AUTHORS & VERSION
    Const MSGTAKETIME As String = "After pressing OK button this " & _
    "will take some time." & DBLSPACE & "Amount of time " & _
    "depends on how many different passwords, the " & _
    "passwords, and your computer's specification." & DBLSPACE & _
    "Just be patient! Make me a coffee!" & AUTHORS & VERSION
    Const MSGPWORDFOUND1 As String = "You had a Worksheet " & _
    "Structure or Windows Password set." & DBLSPACE & _
    "The password found was: " & DBLSPACE & "$$" & DBLSPACE & _
    "Note it down for potential future use in other workbooks by " & _
    "the same person who set this password." & DBLSPACE & _
    "Now to check and clear other passwords." & AUTHORS & VERSION
    Const MSGPWORDFOUND2 As String = "You had a Worksheet " & _
    "password set." & DBLSPACE & "The password found was: " & _
    DBLSPACE & "$$" & DBLSPACE & "Note it down for potential " & _
    "future use in other workbooks by same person who " & _
    "set this password." & DBLSPACE & "Now to check and clear " & _
    "other passwords." & AUTHORS & VERSION
    Const MSGONLYONE As String = "Only structure / windows " & _
    "protected with the password that was just found." & _
    ALLCLEAR & AUTHORS & VERSION & REPBACK
    Dim w1 As Worksheet, w2 As Worksheet
    Dim i As Integer, j As Integer, k As Integer, l As Integer
    Dim m As Integer, n As Integer, i1 As Integer, i2 As Integer
    Dim i3 As Integer, i4 As Integer, i5 As Integer, i6 As Integer
    Dim PWord1 As String
    Dim ShTag As Boolean, WinTag As Boolean

    Application.ScreenUpdating = False
    With ActiveWorkbook
    WinTag = .ProtectStructure Or .ProtectWindows
    End With
    ShTag = False
    For Each w1 In Worksheets
    ShTag = ShTag Or w1.ProtectContents
    Next w1
    If Not ShTag And Not WinTag Then
    MsgBox MSGNOPWORDS1, vbInformation, HEADER
    Exit Sub
    End If
    MsgBox MSGTAKETIME, vbInformation, HEADER
    If Not WinTag Then
    MsgBox MSGNOPWORDS2, vbInformation, HEADER
    Else
    On Error Resume Next
    Do 'dummy do loop
    For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
    For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
    For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
    For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
    With ActiveWorkbook
    .Unprotect Chr(i) & Chr(j) & Chr(k) & _
    Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
    Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
    If .ProtectStructure = False And _
    .ProtectWindows = False Then
    PWord1 = Chr(i) & Chr(j) & Chr(k) & Chr(l) & _
    Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
    Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
    MsgBox Application.Substitute(MSGPWORDFOUND1, _
    "$$", PWord1), vbInformation, HEADER
    Exit Do 'Bypass all for...nexts
    End If
    End With
    Next: Next: Next: Next: Next: Next
    Next: Next: Next: Next: Next: Next
    Loop Until True
    On Error GoTo 0
    End If
    If WinTag And Not ShTag Then
    MsgBox MSGONLYONE, vbInformation, HEADER
    Exit Sub
    End If
    On Error Resume Next
    For Each w1 In Worksheets
    'Attempt clearance with PWord1
    w1.Unprotect PWord1
    Next w1
    On Error GoTo 0
    ShTag = False
    For Each w1 In Worksheets
    'Checks for all clear ShTag triggered to 1 if not.
    ShTag = ShTag Or w1.ProtectContents
    Next w1
    If ShTag Then
    For Each w1 In Worksheets
    With w1
    If .ProtectContents Then
    On Error Resume Next
    Do 'Dummy do loop
    For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
    For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
    For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
    For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
    .Unprotect Chr(i) & Chr(j) & Chr(k) & _
    Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
    Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
    If Not .ProtectContents Then
    PWord1 = Chr(i) & Chr(j) & Chr(k) & Chr(l) & _
    Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
    Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
    MsgBox Application.Substitute(MSGPWORDFOUND2, _
    "$$", PWord1), vbInformation, HEADER
    'leverage finding Pword by trying on other sheets
    For Each w2 In Worksheets
    w2.Unprotect PWord1
    Next w2
    Exit Do 'Bypass all for...nexts
    End If
    Next: Next: Next: Next: Next: Next
    Next: Next: Next: Next: Next: Next
    Loop Until True
    On Error GoTo 0
    End If
    End With
    Next w1
    End If
    MsgBox ALLCLEAR & AUTHORS & VERSION & REPBACK, vbInformation, HEADER
    End Sub

Pandoc介绍

Pandoc

Pandoc:将文本在不同标记语言之间相互转换的工具

  • Pandoc使用Haskell开发,最新版本Pandoc可以使用Haskell平台 包管理器cabal安装

    1
    2
    3
    $ sudo apt install haskell-platform
    $ cabal update
    $ cabal install pandoc
  • Pandoc支持的标记语言格式包括 (具体可通过--list-input-formats查看)

    • Markdown
    • ReStructuredText
    • HTML
    • LaTeX
    • ePub
    • MS Word Docx
    • PDF
  • Pandoc输入、输出文本

    • 可从输入、输出的文件扩展名推测输入、输出格式
    • 缺省输入格式为Markdown、缺省输出格式为html
    • 若未指明输入、输出文件,则读取、写入标准输入、输出
    • 文本默认为utf-8编码,否则可以用iconv转换文本 编码进行输入、输出

Pandoc相关选项

基础选项

  • -f/-t:输入、输出格式
  • -o:输出文件
  • --number-sections/-N:为标题添加编号
  • --verbose:详细调试信息
    • 其中会给出资源文件目录~/.pandoc,存放模板等
  • --log:日志信息
  • --file-scope:分别转换每个文件
    • 指定多个输入文件时默认将多个文件拼接,空行分隔

信息选项

  • --list-input-formats/--list-output-formats:输入、 输出格式
  • --list-extensions[=FORMAT]:列出Markdown扩展支持情况
    • <FORMAT>-<EXT>可以增减格式中一个、多个扩展选项
  • --list-highlight-languages:语法高亮支持语言
  • --list-highlight-styles:语法高亮支持样式

模板选项

  • -standalone/-s:生成完整文件 (仅对可生成片段的某些格式:html、LaTeX)
    • 默认生成文档片段
    • 采用相应内值模板生成完整文件
  • --print-default-template=<FORMAT>/-D <FORMAT>:输出 对应格式的默认模板
  • --template=<TPL>:指定创建文档所需模板
  • --css=<URL>/-c <URL>:指定CSS样式表

自定义值传递

  • --variable=<KEY[:<VAL>]>/-V <KEY[:<VAL>]>:指定模板 变量取值
  • --metadata=<KEY[:<VAL>]>/-M <KEY[:<VAL>]>:指定 元数据字段取值
    • 元数据字段影响模板变量取值,同时影响底层文档元数据
  • --metadata-file=<FILE>:从YAML格式文件中设置元数据字段 取值

PDF生成相关

  • --toc:生成目录
  • --template=<TPL>:编译使用的LaTeX模板,缺省为自带
  • --latex-engine=<ENG>:指定LaTeX引擎,需安装
    • 默认pdflatex对中文支持缺失,建议使用xelatex
  • --highlight-style=<STY>:代码块语法高亮
    • 自带高亮样式可通过--list-highlight-styles查看
    • 也可指定高亮样式文件
  • --listings:LeTeX文档中使用Listings包格式化代码块
  • --biblatex/--natbib:指定处理参考文献程序
  • --bibliography=<FILE>:设置文档元数据中参考文献信息
  • -f markdown-implicit_figures设置Markdown格式,指定 图像保持原始位置,避免pdf中错位

HTML生成相关

  • --self-contained:将css、图片等所有外部文件压缩进html 文件中
  • Markdown中使用html标记可以在转换为html后保留,可以据此 设置转换后的样式

DOCX生成相关

  • --reference-doc=<FILE>:指定格式参考文件
    • 参考文件内容被忽略,就样式、文档属性被使用
  • --print-default-data-file=reference.docx:输出系统默认 模板
  • --extract-media=<DIR>:提取文档中多媒体文件至文件夹, 并在目标文件中设置对其引用

EPUB生成相关

  • --epub-cover-image=<FILE>
  • --epub-metadata=<FILE>
  • --epub-embed-font=<FILE>

数学公式渲染

  • --mathjax[=<URL>]
  • --mathml
  • --katex[=<URL>]

Pandoc模板

模板变量

模板变量:Pandoc模板中可以包含变量用于自定义模板

1
2
3
4
5
6
7
8
9
10
11
$title$						# 变量表示方法

$if(var)$ # 变量条件语句
X
$else$
Y
$endif$

$for(var)$ # 变量循环语句
X
$endfor$
  • 变量赋值方式
    • 命令行参数提供
    • 文档元数据中查找

TeX、LaTeX、XeLaTeX

TeX

TeX:由Donald Knuth开发的高质量排版系统

  • TeX的范畴包括标记语法(命令)、具体实现(引擎),在不同 场合含义不同,类似语言、编译器

  • 初版TeX包含300左右命令,随后Donald添加Plain TeX扩展包 定义了600左右常用宏命令

  • TeX中将标记关键字称为命令,其实关键字确实类似命令,可能 系统对应命令、语言对应关键字

TeX宏包

  • *.cls类文件:定义文档结构
  • *.sty包/样式文件:提供类未包括的任何东西
    • 对类文件功能的补充:提供从属于类文件的功能
    • 对类文件功能的修改:改变类文件的风格

基础排版宏包

  • LaTeX:Leslie Lamport设计的更高层次、更抽象的排版格式

    • 包含以TeX命令为基础的一系列高层、抽象宏命令,包括 \section\usepackage
    • 用户可以使用模板而不必决定具体排版、打印,使用更加 方便
    • 是学界事实上的标准排版格式
  • ConTeXt:Pragma-ADE公司设计的文档制造格式

    • 为TeX提供对先进打印特性的易用接口
    • 生成的编译文件更美观,适合专业印刷行业使用
  • TeXinfo:FSF(Free Software Foundation)设计的格式

    • 是Linux系统的标准文档系统

中文排版宏包

  • xeCJK:在XeTeX引擎下处理中日韩文字断行、标点调整、字体 选择的基础性宏包

    • 基础从CCT、CJK以来的标点禁则、标点压缩、NFSS字体补丁
    • 实际上仅对简体中文处理机制比较完全
    • XeTeX本身已经能够大概处理中文文档的排版,但在某些 细节部分仍然可以改进
    • 类似的宏包还有:zhspacing、xCJK、xCCT
  • CTeX:提供了编写中文文档时常用的宏命令

其他宏包

  • AMS-TeX/AMS-LaTeX:AMS(American Mathematical Society) 设计的格式
    • 提供了额外的数学字体、多行数学表述排版

TeX引擎

  • pdfTex:将TeX文本编译输出为pdf格式的引擎实现

    • 最初TeX/LaTeX实现将TeX编译为DVI格式,然后方便转换为 PostScript文件用于打印
    • 而pdf格式超越PostScript格式成为更流行的预打印格式
    • 因此事实上,现在LaTeX发行版中包含4个部分:TeX、 pdfTeX、LaTeX、pdfLaTeX
  • XeTeX:扩展了TeX的字符、字体支持的引擎实现

    • 最初TeX/LaTeX仅仅支持英语数字、字母
    • XeTeX提供了对Unicode字符和TrueType/OpenType字体的 直接支持
  • LuaTeX:将TeX扩展为更sensible的编程语言的实现

TeX发行版

TeX Live

TeX Live:TUG(TeX User Group)发布、维护的TeX系统

  • TeX Live包含
    • 与TeX系统相关的各种程序
      • pdfTeX
      • XeTeX
      • LuaTeX
    • 编辑查看工具
      • DVIOUT DVI Viewer
      • PS View
      • TeXworks
    • 常用宏包
      • LaTeX
    • 常用字体
    • 多个语言支持

MiKTeX

MiKTeX:Christian Schenk开发的在MSWin下运行文字处理系统

CTeX

CTeX:CTeX学会开发,将MiKTeX及常用应用封装

  • 集成WinEdt编辑器
  • 强化了对中文的处理

Todo.txt

Todo.txt格式

  • todo.txt格式使用纯文本存储、表示任务
  • 存储任务的文本文件中每行表示一项task
  • todo.txt类清单管理应用因此一般具备如下特点
    • 待完成任务、已完成任务分为两个文件分别存储
    • 可以自由修改任务存储文件以修改任务内容

基本要素

todotxt_format_description

  • 任务结构:各部分之间使用空格分隔

    • x:任务完成标识符
    • 优先级:([A-Z])
    • 完成日期、创建日期:Y-m-d格式
    • 任务描述:任务主体部分
  • 任务描述部分可以包含各种类型的tag,tag格式上可以放在任务 任何部分,但习惯上放在末尾

    • project+标识
    • context@标识
    • [key]:[value]:metadata键值对,key表示键值对含义 (中间一般不用空格分隔,便于处理)
  • 常用特殊metadata键值对
    • 时间戳:t:Y-m-d
    • 截至日期:due:Y-m-d

Todo.txt工具

todo.txt-cli

todo.txt-cli:基于shell脚本管理todo.txt文件

  • 只提供基本todo.txt功能,可以通过自行添加脚本插件方式扩展

    • 插件文件即普通可执行脚本文件,todo.sh会将命令参数 传递给相应脚本文件
    • todo.sh [action]将直接调用相应action名称脚本 (可建立同名文件夹、文件管理,同名文件夹文件被调用)
  • 使用两个文件分别存储待完成任务、已完成任务

    • 待完成任务文件中可以自行x标记完成,然后使用命令 归档至已完成任务文件中

topydo

topydo:基本python脚本管理todo.txt文件

  • 提供了cli、prompt、column三种模式
  • 原生支持以下标签
    • due、start日期
    • 管理任务之间依赖管理
    • 重复任务