个人交互外壳

Read, Think, Write and Loop

0 起因

Linux 下面会有大量的配置文件,他们多是以.开头的隐藏文件,放置在HOME下面,后者~/.config/文件夹下面,如果需要在多台电脑上保持这些配置文件的一致,可以使用git的办法去管理,这里用到了一个git的特殊用法。

1 建立 bara 的仓库

1
2
3
4
git init --bare $HOME/.dotconfig
alias dotconfig='/usr/bin/git --git-dir=$HOME/.dotconfig/ --work-tree=$HOME'
dotconfig config --local status.showUntrackedFiles no
echo "alias dotconfig='/usr/bin/git --git-dir=$HOME/.dotconfig/ --work-tree=$HOME'" >> $HOME/.bashrc

2 添加需要管理的dot files

1
2
3
4
5
6
dotconfig status
dotconfig add .config/lvim/config.lua
dotconfig commit -m "Add lvim config.lua"
dotconfig add .bashrc
dotconfig commit -m "Add bashrc"
dotconfig push

3 github 上建立名为 dotconfig 的仓库,并在本地设置 remote 地址

1
2
3
git remote add origin https://github.com/zhydong258/dotconfig.git
git branch -M main
git push -u origin main

4 在新的电脑上同步

4.1 clone 到本地

1
2
3
4
5
git clone --bare https://github.com/zhydong258/dotconfig.git $HOME/.dotconfig
alias dotconfig='/usr/bin/git --git-dir=$HOME/.dotconfig/ --work-tree=$HOME'
dotconfig checkout
dotconfig config status.showUntrackedFiles no
echo "alias dotconfig='/usr/bin/git --git-dir=$HOME/.dotconfig/ --work-tree=$HOME'" >> $HOME/.bashrc

4.2 脚本的形式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
git clone --bare https://github.com/zhydong258/dotconfig.git $HOME/.dotconfig
function dotconfig {
/usr/bin/git --git-dir=$HOME/.dotconfig/ --work-tree=$HOME $@
}
mkdir -p .dotconfig-backup
dotconfig checkout
if [ $? = 0 ]; then
echo "Checked out config.";
else
echo "Backing up pre-existing dot files.";
dotconfig checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | xargs -I{} mv {} .dotconfig-backup/{}
fi;
dotconfig checkout
dotconfig config status.showUntrackedFiles no

其中,$?中存储的是上个命令执行的结果,如果成功返回0,如果失败,则返回值非0。这里上一条命令是dotconfig checkout,如果出现类似如下错误,表明本地目录已经有文件存在了。

1
2
3
4
5
error: The following untracked working tree files would be overwritten by checkout:
.bashrc
.gitignore
Please move or remove them before you can switch branches.
Aborting

在后续的else中,这些已经存在的文件会移动到.dotconfig-backup文件夹里面。

0 起因

原有使用的 DNS 服务器是 Windonws Server 2008,已经不再提供安全更新了,想着索性升级到最新版,按照新的管理规定优先采用国产的服务器系统,
第一个想到的是OpenEuler,所以就决定采用国产的系统进行替换,刚好借此机会学习一下 Linux 上 DNS 服务的部署和配置方法。当然,这里又犯了爱折腾的毛病。

0.1 需要配置的主机和IP

1
2
3
4
5
6
nj-dns.cnty.com        192.168.7.120
nj-gitlab.cnty.com 192.168.7.121
nj-vcsa.cnty.com 192.168.7.44
nj-nextcloud.cnty.com 192.168.7.45
nj-exsi1.cnty.com 192.168.6.252
nj-exsi2.cnty.com 192.168.7.99

1 安装 OpenEuler

采用默认的方式安装,没有什么意外情况,图形界面的方式还是比较直观的。

2 安装 DNS Server

使用 dnf 安装 BIND(Berkeley Internet Name Domain)

1
sudo dnf install bind bind-utils -y

3 配置 DNS

3.1 /etc/named.conf

include "/etc/named.rfc1912.zones"; 这一行上面添加如下的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
zone "cnty.com" IN {
type master;
file "forward.cnty.com";
allow-update { none; };
};

zone "168.192.in-addr.arpa" IN {
type master;
file "reverse.cnty.com";
allow-update { none; };
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

3.2 /var/nanmed/forward.cnty.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$TTL 86400
$ORIGIN cnty.com.
@ IN SOA nj-dns.cnty.com. root.cnty.com. (
2011071001 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)
IN NS nj-dns.cnty.com.
nj-dns IN A 192.168.7.120
nj-vcsa IN A 192.168.7.44
nj-gitlab IN A 192.168.7.121
nj-nextcloud IN A 192.168.7.45
nj-exsi1 IN A 192.168.6.252
nj-exsi2 IN A 192.168.7.99
oa IN A 192.168.x.x
www IN A 115.231.8.xxx

3.3 /var/named/reverse.cnty.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$TTL 86400
@ IN SOA nj-dns.cnty.com. root.cnty.com. (
2011071001 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)

@ IN NS nj-dns.cnty.com.
@ IN A 192.168.7.120

120.7 IN PTR nj-dns.cnty.com.
44.7 IN PTR nj-vcsa.cnty.com.
121.7 IN PTR nj-gitlab.cnty.com.
45.7 IN PTR nj-nextcloud.cnty.com.
99.7 IN PTR nj-exsi2.cnty.com.
252.6 IN PTR nj-exsi1.cnty.com.

4 检查配置文件

1
2
3
sudo named-checkconf /etc/named.conf
sudo named-checkzone forward.cnty.com /var/named/forward.cnty.com
sudo named-checkzone reverse.cnty.com /var/named/reverse.cnty.com

5 配置防火墙

1
2
sudo firewall-cmd --add-service=dns --perm
sudo firewall-cmd --reload

6 启动 DNS Server

1
2
sudo systemctl enable named
sudo systemctl start named

7 测试 DNS 服务

1
2
dig nj-vcsa.cnty.com
dig -x 192.168.7.44

参考

  1. 如何使用 bind 设置 DNS 服务器
  2. 3. Configurations and Zone Files
  3. DNS 多网段的反向记录

0 起因

公司虚拟机上使用的 Ubuntu 升级到 22.04 后,Dash to Dock 这个extension 就无法正常使用了,和 HP CQ45 上 Debian Testing升级到最新的版本后的情况是一样的,主要是升级到 GNOME 42 后,插件无法兼容了,重新安装了 Dash to Dock for COSMIC 插件。好奇 COSMIC 是什么,就搜索了一下,发现是 System76 公司开发的 Pop!_OS 系统的桌面环境,还发现很多人在推荐 Pop!_OS 这个发行版,就决定试用一下。当然,这里又犯了爱折腾的坏毛病……

1 安装

官网下载 ISO ,rufus 制作启动优盘,电脑优盘启动,硬盘重新分区,CQ45 上有 Win11 和 Debain Testing 的双系统。原来是先安装的 Win11,硬盘是 UEFI+GPT 的格式,partition 2 是 EFI 分区,挂载点是 /boot/efi。原来的 EFI 是 300M的,而 Pop_OS 需要 500M 的,确定把这个分区先删除掉,重新进行分区。当时没有认识到,Win11 也是需要从这里启动的,这也直接导致后面 Win11 无法引导了。

原始的 EFI 只有 315MB,如下图所示:

重新调整 EFI 的分区,如下图所示:

2 无法引导

2.1 问题1 - 无法进入 Windows

后续的安装过程平淡无奇,第一次报了文件解压错误,安装失败,重新引导再来一次就成功了。拔掉优盘,引导系统,顺利进入 Pop_OS。不过问题是直接进到 GDM 的登录界面了,没有GRUB,没有可以选择 Windows 的地方。

重启,进入 BIOS,改成 UEFI引导,关闭 Secure Boot ,还是直接进入 Pop_OS。

2.2 问题1 - 解决

原因是我在安装 Pop_OS 的时候,删除并重建了 EFI 分区,而新的 EFI 分区上没有 Windows 的启动文件,只需要重建就可以了。

刚好手上有现成的 Win10 的优盘,优盘引导进入系统,选择“修复计算机”-“命令提示符”。

1
2
3
4
5
6
7
8
diskpart # 进入diskpart工具
list disk # 查看磁盘列表,通常是2个,一个是硬盘,一个是优盘
select disk [num] # 选择磁盘
list partition # 查看选定的磁盘分区
select partition [num] # 选择 EFI 分区,通常是 卷2,要确认一下
assign letter = [letter] # 给选定的分区分配一个盘符,例如 z
exit # 退出 diskpart
bcdboot c:\windows /s z: /f uefi /l zh-cn # 注意 c 盘是不是真正的 c 盘,z: 对应上面分配的盘符

具体可见微软文档的BCDBoot命令行选项

2.3 问题2 - 只能进入 Windows

上述的修复过后,开机后直接进入 Windows,当然 CQ45 可以在开机时通过 ESC 进入选项,通过 F9 来选择进入的系统,但是为什么不能像 Ubuntu 那样通过 GRUB 来选择呢?进 BIOS 看看,通过下图可以看到,这货在 UEFI 下就没打算引导其他系统,就一个“操作系统的启动管理员”,钦定 Windows。

2.4 问题2 - 解决

没有好的办法,只能取消 Windows Boot Manager,可以使用免费的 DiskGenius。

取消了 Windows 的启动管理器,正常开机进入 Pop_OS 的引导界面。

3 Systemd-boot 和 GRUB2

3.1 systemd-boot

Pop_OS 使用 systemd-boot 来进行系统的引导,systemd 仅适合单系统引导,双系统引导就无法完成,因为其无法识别在多个硬盘上的不同分区的引导加载器,除非将 Windows 分区上的 esp 文件复制到 Linux esp 下,新手不建议折腾,直接根据本教程安装 grub 引导即可。

3.2 GRUB2

3.2.1 安装

1
sudo apt install grub-efi grub2-common grub-customizer

关于 grub-customizer 的安装,请参考 How to Install Grub Customizer on Ubuntu

3.3 安装 grub

安装 grub 到 /boot/grub 中去。

1
sudo grub-install

使用 EFI 去引导 GRUB。

1
sudo cp /boot/grub/x86_64-efi/grub.efi /boot/efi/EFI/pop/grubx64.efi

64 位的系统,需要修改位 grubx64.efi。efi 在 64位系统下,默认只会引导后缀为 x64 的 efi 文件。

4 EFI 的结构和引导

挖坑不填

本来是花了很长时间去了解和学习的,但是没有系统的记录下来,只是在本子上简单的画了一下,后期又懒病发作,就再也没有写上。
其实,中间有过一次尝试,发现连上次能看懂的东西都变得模糊了,后期就再也不想去写了。

参考

  1. PopOS 20.04 安装 Grub 引导 Win 11 + Linux 双系统并配置主题
  2. How to Install Grub Customizer on Ubuntu

NexT Compatibility with Hexo Version

Version Hexo 3.0.0-beta.4 or earlier Hexo 3.0.0-rc.1 ~ 3.9 Hexo 4.0~4.2.1 Hexo 5.0 or later
NexT v0.4.5.1 or earlier ❌Icon(2) ❌Icon(2)
NexT v0.4.5.2 ~ v7.4.1 ⚠️Data Files(1) ❌Icon(2) ❌Icon(2)
NexT v7.4.2 ~ v8.1.0 ⚠️Data Files(1)
NexT v8.2.0 or later ⚠️Nunjucks(3) ⚠️ Nunjucks(3) ⚠️ Nunjucks(3)

(1): Hexo 3.0.0-beta.4 or earlier does not support Data Files.

(2): Icons may not be displayed normally.

(3): Nunjucks renderer plugin required.

NexT Repositories

Due to historical reasons, NexT has three different repositories.

Years Version Repository
2014 ~ 2017 v5 https://github.com/iissnan/hexo-theme-next
2018 ~ 2019 v6 ~ v7 https://github.com/theme-next/hexo-theme-next
2020 v8 https://github.com/next-theme/hexo-theme-next

Install

Use npm

1
2
$ cd hexo-site
$ npm install hexo-theme-next@latest

Use git

1
$ git clone https://github.com/next-theme/hexo-theme-next themes/next

Add NexT as git submodule

blog本身的源码是用git管理的,所以NexT的添加,需要使用submodule的方式。
git submodule add https://github.com/next-theme/hexo-theme-next themes/next
因为是使用 submodule 的缘故,有新版本需要更新 NexT 的时候,一定要进入NexT的文件夹。

1
2
cd themes/next
git pull origin master

Configuration

How to configure Hexo and NexT? The traditional approach is to store some options in site config file and other options in theme config file. This approach is applicable, but it is not smooth to update NexT theme from pulling or downloading new releases.

At present, NexT encourages users to use the Alternate Theme Config. It’s a feature of Hexo and the documentation is here: Hexo Configuration.

This tutorial shows you how to configure NexT using Alternate Theme Config. Please choose only one of the following solutions and resume next steps.

_config.[name].yml
With this way, all your configurations locate in config file /_config.[name].yml. Replace [name] with the value of theme option in site config file, e.g. next.

Usage
Please ensure you are using Hexo 5.0 (or later).

Create a config file in site’s root directory, e.g. _config.next.yml.

Copy needed NexT theme options from theme config file into this config file. If it is the first time to install NexT, then copy the whole theme config file by the following command:

Installed through npm

cp node_modules/hexo-theme-next/_config.yml _config.next.yml

Installed through Git

cp themes/next/_config.yml _config.next.yml

Markdown Syntax

Include Posts

Include links to other posts.

1
2
{% post_path filename %}
{% post_link filename [title] [escape] %}

You can ignore permalink and folder information, like languages and dates, when using this tag.

For instance:

1
{% post_link how-to-bake-a-cake %}

This will work as long as the filename of the post is how-to-bake-a-cake.md, even if the post is located at source/posts/2015-02-my-family-holiday and has permalink 2018/en/how-to-bake-a-cake.

You can customize the text to display, instead of displaying the post’s title.

Post’s title and custom text are escaped by default. You can use the escape option to disable escaping.

For instance:

Display title of the post.

1
{% post_link hexo-3-8-released %}

Display custom text.

1
{% post_link hexo-3-8-released 'Link to a post' %}

Escape title.

1
{{% post_link hexo-4-released 'How to use <b> tag in title' %}}

<b>会直接显示出来。

Do not escape title.

1
{% post_link hexo-4-released '<b>bold</b> custom title' false %}

bold这个单词会加粗。

链接到文章内的标题

1
[要显示的内容](#标题的名字)

注意:小括号中#后的标题的名字,不能用大写字母、空格和英文的句点,但问号和顿号可以。大写要改成小写,空格和句点改成短横杠。

中文的麻烦一些,处理方式如下,其中<a>可以是<div><span><p>等:

1
2
3
## <a id="section1">第一章</a>

可以参考前面的<a href="#section1">第一章</a>

Escape Content

Hexo uses Nunjucks to render posts (Swig was used in older version, which share a similar syntax). Content wrapped with{{ }}or{% %}will get parsed and may cause problems. You can skip the parsing by wrapping it with the raw tag plugin, single backtick `{{ }}`or triple backtick.
Alternatively, Nunjucks tags can be disabled through the renderer’s option (if supported), API or front-matter.

1
2
3
{% raw %}
Hello {{ world }}
{% endraw %}
1
2
3
```
Hello {{ world }}
```

常用的转义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
! &#33;         — 惊叹号 Exclamation mark
” &#34; &quot; — 双引号 Quotation mark
# &#35; — 数字标志 Number sign
$ &#36; — 美元标志 Dollar sign
% &#37; — 百分号 Percent sign
& &#38; &amp; — Ampersand
‘ &#39; — 单引号 Apostrophe
( &#40; — 小括号左边部分 Left parenthesis
) &#41; — 小括号右边部分 Right parenthesis
* &#42; — 星号 Asterisk
+ &#43; — 加号 Plus sign
< &#60; &lt; — 小于号 Less than
= &#61; — 等于符号 Equals sign
- &#45; &minus; — 减号
> &#62; &gt; — 大于号 Greater than
? &#63; — 问号 Question mark
@ &#64; — Commercial at
[ &#91; — 中括号左边部分 Left square bracket
\ &#92; — 反斜杠 Reverse solidus (backslash)
] &#93; — 中括号右边部分 Right square bracket
{ &#123; — 大括号左边部分 Left curly brace
| &#124; — 竖线Vertical bar
} &#125; — 大括号右边部分 Right curly brace

Github Actions、Github Pages

简单的说Actions就是Github推出的CI工具,代码推送到Github后,可以触发一系列的动作。

Github Pages,Github给出的最简介绍,”Websites for you and your projects.”

Personal access tokens and repository’s Secrets

因为需要从Blog的库去访问username.github.com的库,所以之间需要一些token的传递。

Personal access tokens

在”Developer settings”中打开”Personal access tokens”,点击”Generate new token”生成新的token,”scopes”中只选择”repo”,生成token字符串。

Secrets

在Repository的Settings中,打开Secrets的选项,点击”New repository secret”生成Repository secrets,填写名称和token的字符串,注意这个名称和后面的deply.yml中的一致性。

deploy.yml

Github Pages是放在用户同名仓库下面的,因为我使用了JamesIves/github-pages-deploy-action的deploy方式,这里有要注意的地方。在zhydong258.github.com下面,有两个branch,一个是master,一个是source。所有的hexo的源文件都放在source下面,提交后通过Actions自动在master下面生成静态页面。

workflows下的部署文件。

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
name: Deploy GitHub Pages

# 触发条件:在 push 到 source 分支后
on:
push:
branches:
- source
paths-ignore: # 下列文件的变更不触发部署,可以自行添加
- README.md
- LICENSE

# 任务
jobs:
build-and-deploy:
# 服务器环境:最新版 Ubuntu
runs-on: ubuntu-latest
steps:
# 拉取代码
- name: 📦 Checkout
uses: actions/checkout@v2
with:
persist-credentials: false

# 生成静态文件
- name: 🔧 Install and Build
run: |
npm install hexo-cli -g
npm install
hexo clean
hexo generate
# 如果采用 yarn 进行包管理,则使用下面的代码
# yarn
# yarn build

# 部署到 GitHub Pages
- name: 🚀 Deploy
uses: JamesIves/github-pages-deploy-action@4.1.7
with:
# GitHub 的 Personal access tokens
token: ${{secrets.BLOG_DEPLOY}}
# 要部署到的分支
branch: master
# 上一步生成的静态文件的地址
folder: public

Github branch

因为需要创建source这个branch,简单的命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
## step 1:创建本地分支
git branch source

## step 2:切换到新创建的分支
git checkout source

# 上述两条命令等价于 `git checkout -b source`

## step 3:添加项目中所有文件
git add .

## step 4:
git commit -m "New Branch source"

## step 5:将新分支 push 到 GitHub
git push --set-upstream origin source

为什么用Actions

阅读全文 »

今天又想起来自己在Github的博客了,从上面clone下来,重新安装了nvm和lts的node。发现hexo版本比较低,决定升级。

首先,进入Hexo初始化的文件夹。

安装hexo-cli

1
$ npm install -g hexo-cli

安装升级需要的package

检查系统安装的插件是否需要升级。

1
2
$ npm install -g npm-check
$ npm-check

升级系统的所有插件。

1
2
$ npm install -g npm-upgrade
$ npm-upgrade

重新install

1
2
$ rm -rf node_modules
$ npm install --save

Breaking changes

大版本升级,问题多出现在_config.xml上,搜索下解决就好。

NexT主题的升级

直接从Github下载最新的主题,注意themes\next\_config.xml要自己修改了。

原文出处如下:
“找不到了,反正就是在microsoft的问答上看到的”

引用的原文如下:
For anyone who want to remove ms-resource:AppName/Text, here’s a solution:
https://gist.github.com/DoubleLabyrinth/ffae94cb9444bbdae1d11deeaa247310

All you need is this:
Run Powershell with Admin privilege
On the prompt, run this command:

1
Get-AppxPackage -all *HolographicFirstRun* | Remove-AppPackage -AllUsers

Open Task manager, kill explorer.exe (keep the powershell console open)
Back on the prompt, type:

1
cd $Env:localappdata\Packages\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy

If the previous command succesfully put you on AppData\Local\Packages\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy directory inside your profile dir, then run:

1
Remove-Item -Recurse -Force .\TempState\

Start explorer.exe back up from task manager (File -> New Task)
The rogue start menu item should be gone.

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Install

1
2
3
4
$ npm install hexo-cli -g
$ hexo init blog
$ cd blog
$ npm install

Create a new post

1
2
3
$ hexo new "My New Post"
$ hexo new page about
$ hexo new page tags

Create a new draft

1
hexo new draft <title>

上面的命令会建立一篇文章的草稿,放到 source/_draft 中,可以使用 publish 发布到 source/_posts 中。

1
hexo publish <title>

<% note warning %>
这里的title,要和 _draft 中的文件名一直,可能需要把空格变成“-”。
<% endnote %>

Asset 资源文件夹

资源(Asset)代表 source 文件夹中除了文章以外的所有文件,例如图片、CSS、JS 文件等。比方说,如果你的Hexo项目中只有少量图片,那最简单的方法就是将它们放在 source/images 文件夹中。然后通过类似于 ![](/images/image.jpg) 的方法访问它们。

对于那些想要更有规律地提供图片和其他资源以及想要将他们的资源分布在各个文章上的人来说,Hexo也提供了更组织化的方式来管理资源。这个稍微有些复杂但是管理资源非常方便的功能可以通过将 config.yml 文件中的 post_asset_folder 选项设为 true 来打开。

Embedding an image using markdown

hexo-renderer-marked 3.1.0 introduced a new option that allows you to embed an image in markdown without using asset_img tag plugin.

To enable:

1
2
3
4
5
_config.yml
post_asset_folder: true
marked:
prependRoot: true
postAsset: true

Once enabled, an asset image will be automatically resolved to its corresponding post’s path. For example, “image.jpg” is located at “/2020/01/02/foo/image.jpg”, meaning it is an asset image of “/2020/01/02/foo/“ post, ![](image.jpg) will be rendered as <img src="/2020/01/02/foo/image.jpg">.

More info: Writing

Run server

1
2
$ hexo server
$ hexo server -p 5000

More info: Server

Generate static files

1
2
$ hexo generate
$ hexo generate --deploy

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

Add tags and categories

1
2
3
4
tags:
- Testing
- Another Tag
categories: Label

More info: Tags

Jekyll添加评论系统

搭建在github上的blog,需要一个comments的系统。话说,用的可能性不大,不过看别人有,所以自己也就添加了一个。

duoshuo

评论是用的多说,国产的还是比较适合国内的环境,在多说上注册一个账号。填上你的网站名称和地址,
填上一个short-name,最后会给出参考的代码,通用代码就行。

配置jekyll

jekyll默认的comments是 disqus系统,打开_config.yml文件,修改comments的provider为duoshuo,修改short-name。

需改JB的提供的duoshuo代码

打开_include/JB/comments-providers/duoshuo,把多说网站提供的通用代码粘贴进来,覆盖掉原来的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- 多说评论框 start -->
<div class="ds-thread" data-thread-key="{{ page.id }}" data-title="{{ page.title }}" data-url="{{ site.url}}{{ page.url }}"></div>
<!-- 多说评论框 end -->
<!-- 多说公共JS代码 start (一个网页只需插入一次) -->
<script type="text/javascript">
var duoshuoQuery = {short_name:'{{ site.JB.comments.duoshuo.short_name }}'};
(function() {
var ds = document.createElement('script');
ds.type = 'text/javascript';ds.async = true;
ds.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';
ds.charset = 'UTF-8';
(document.getElementsByTagName('head')[0]
|| document.getElementsByTagName('body')[0]).appendChild(ds);
})();
</script>
<!-- 多说公共JS代码 end -->
0%