<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[黄昏后院 - Aren's Blog]]></title><description><![CDATA[仁者求智，智者存仁。]]></description><link>https://www.dbaren.com/</link><image><url>https://www.dbaren.com/favicon.png</url><title>黄昏后院 - Aren&apos;s Blog</title><link>https://www.dbaren.com/</link></image><generator>Ghost 3.36</generator><lastBuildDate>Fri, 19 Jun 2026 17:35:07 GMT</lastBuildDate><atom:link href="https://www.dbaren.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[基于Python的Xgboost实战代码]]></title><description><![CDATA[大数据机器学习，Python Xgboost使用方法与代码演示]]></description><link>https://www.dbaren.com/post/python-xgboost-how-to-use/</link><guid isPermaLink="false">61bf7278de98590001719771</guid><category><![CDATA[大数据]]></category><dc:creator><![CDATA[Aren]]></dc:creator><pubDate>Sun, 19 Dec 2021 18:02:57 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>参加了一下单位组织的大数据建模比赛，记录一下，当做个笔记</p>
<pre><code class="language-python">import pandas as pd
import numpy as np
from sklearn.model_selection import KFold
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from itertools import product as prod
</code></pre>
<p>封装工具函数</p>
<pre><code class="language-python"># 数据清洗函数
def data_filter(data):
	&quot;&quot;&quot;
    处理缺失值，挑选特征等等
    Input: 
        data: pd.Dataframe or np.array, 原始数据
    Return:
        filted_data: pd.Dataframe or np.array, 处理后的数据
    &quot;&quot;&quot;
    # 假设输入 Dataframe, 删除具有缺失值的数据样本
	# 数据清洗操作
	filted_data = data
	# filted_data[&quot;sample&quot;] = filted_data[&quot;sample&quot;].replace(np.nan, filted_data[&quot;sample&quot;].mean()) # 把NaN替换成均值

	filted_data = filted_data.dropna()  # 删除有缺少值的行
	return filted_data

# 字符串转数值枚举
def str_enum(data):
	filted_data = data
	# 字符串映射转数值枚举
	# 把品牌字段处理为枚举值
	a = filted_data[&quot;brnd_nam&quot;].drop_duplicates().reset_index()
	brand_dict = {}
	for i in a.index:
	    brand_dict[a[&quot;brnd_nam&quot;][i]] = i
	filted_data[&quot;brnd_nam&quot;] = filted_data[&quot;brnd_nam&quot;].map(brand_dict)
	filted_data[&quot;gdr_typ_nam&quot;].map({&quot;资料不详&quot;:0, &quot;男&quot;:1, &quot;女&quot;:2})
	filted_data[&quot;dou_ca_usr&quot;] = filted_data[&quot;dou_ca_usr&quot;].map({&quot;否&quot;:0, &quot;是&quot;:1})
	
	return filted_data

# K折获取训练数据、测试数据
def K_fold_train_test(X, y, random_seed=0):
    &quot;&quot;&quot;
    使用 K 折交叉验证获取多个训练集和测试集
    Input:
        X: np.array with shape(sample_num, feature_dim) 数据集所有样本的特征值
        y: np.array with shape(sample_num,) 数据集所有样本的对应标签
        random_seed: int 设置随机种子，决定每次随机采样是否产生相同的随机值
    Return:
        train_data: [tuple(X, y)] 返回一个 tuple 的列表，每一个 tuple 代表一个训练集
        test_data: [tuple(X, y)] 返回一个 tuple 的列表，每一个 tuple 代表一个测试集
    &quot;&quot;&quot;
    train_data = []
    test_data = []
    
    # sklearn.model_selection.RepeatedKFold 函数
    kf = KFold(n_splits=5, shuffle=True, random_state=random_seed)
    for train_index, test_index in kf.split(X):
        train_tup = (X[train_index], y[train_index])
        test_tup = (X[test_index], y[test_index])
        train_data.append(train_tup)
        test_data.append(test_tup)
    
    return train_data, test_data


&quot;&quot;&quot;
模型参数处理模块
Function to convert dictionary of lists to list of dictionaries of all combinations of listed variables. 
Example:
    list_of_param_dicts({'a': [1, 2], 'b': [3, 4]}) ---&gt; [{'a': 1, 'b': 3}, {'a': 1, 'b': 4}, {'a': 2, 'b': 3}, {'a': 2, 'b': 4}]
&quot;&quot;&quot;
def list_of_param_dicts(param_dict):
    &quot;&quot;&quot;
    Arguments:
        param_dict   -(dict) dictionary of parameters
    &quot;&quot;&quot;
    vals = list(prod(*[v for k, v in param_dict.items()]))
    keys = list(prod(*[[k]*len(v) for k, v in param_dict.items()]))
    return [dict([(k, v) for k, v in zip(key, val)]) for key, val in zip(keys, vals)]
</code></pre>
<pre><code class="language-python"># 训练集数据
df_train = pd.read_csv(&quot;train_set.csv&quot;)
# 测试集数据
df_test = pd.read_csv(&quot;test_set.csv&quot;)

# 训练数据删除指定的某几列
train_d=df_train.drop(labels=['usr_id',&quot;month&quot;,&quot;cust_typ_cd&quot;],axis=1)
train_d = str_enum(train_d)
train_d = data_filter(train_d)
train_d

# 测试数据删除指定的某几列
test_d = df_test.drop(labels=[&quot;month&quot;, &quot;cust_typ_cd&quot;],axis=1)
test_d = str_enum(test_d)
test_d = data_filter(test_d)
test_d
</code></pre>
<p>73分的方式调试模型：</p>
<pre><code class="language-python"># ================ Xgboost =====================
import xgboost as xgb
import random                              

train_data = train_d.values
train_features = train_data[:, 1:]                       # 训练数据特征
train_labels = train_data[:, 0]                          # 训练数据标签

data_length = len(train_data)
random.seed(2)                                            # 设置随机数，改变不同的种子会有不同的随机结果
sample_idx = list(range(len(train_data)))
random.shuffle(sample_idx)
split_idx = int(0.7*data_length)
train_X = train_features[sample_idx[:split_idx]]
train_y = train_labels[sample_idx[:split_idx]]
test_X = train_features[sample_idx[split_idx:]]
test_y = train_labels[sample_idx[split_idx:]]
train_y = train_y.astype('int')
test_y = test_y.astype('int')

# 数据归一化
std = StandardScaler()
train_X = std.fit_transform(train_X)
test_X = std.transform(test_X)

dtrain = xgb.DMatrix(train_X,train_y)
dtest = xgb.DMatrix(test_X)

# 用最优参数构建模型
param = {'max_depth':20, 'eta':0.3, 'objective':'binary:logistic', 'eval_metric':'logloss'}
xgboost_model = xgb.train(param, dtrain, num_boost_round=20)

predicted_y = xgboost_model.predict(dtest)
for i in range(len(predicted_y)):
    if predicted_y[i] &gt; 0.5:
        predicted_y[i]=1
    else:
        predicted_y[i]=0

print('=========================================================================================')
print('参数: ')
print(param)
print('准确率：', accuracy_score(test_y, predicted_y))
print('精度：', precision_score(test_y, predicted_y))
print('召回率：', recall_score(test_y, predicted_y))
print('F1：', f1_score(test_y, predicted_y))
</code></pre>
<p>或者用K折(效果更好，但因为进行K次会更耗时)</p>
<pre><code class="language-python"># ================================= XGBoost =============================
import xgboost as xgb

# 设定不同的参数
&quot;&quot;&quot;
param_dict = dict(
    max_depth = [6],
    eta = [0.3],
    subsample = [ 0.8],
	colsample_bytree = [0.8],
    objective = ['binary:logistic'],
    eval_metric = ['error','logloss','map', 'auc'],
    seed = [0]
	gamma = [0.1]
	
)
&quot;&quot;&quot;
param_dict = dict(
    max_depth = [20],
	eta = [0.5],
	subsample = [1],
	colsample_bytree = [1],
	objective = ['binary:logistic'],
	eval_metric = ['error']
)
# 获得多组不同的参数组合
param_list = list_of_param_dicts(param_dict)

# 每个参数组合运行一次结果，看看哪个好
best_f1 = 0.0
best_param = None
for param in param_list:
    accs = []
    pres = []
    recalls = []
    f1s = []
    for sample_idx in range(len(train_data)):
        train_X, train_y = train_data[sample_idx]
        test_X, test_y = test_data[sample_idx]
        train_y = train_y.astype('int')
        test_y = test_y.astype('int')
        
        # 数据归一化处理
        std = StandardScaler()
        train_X = std.fit_transform(train_X)
        test_X = std.transform(test_X)
        
        dtrain = xgb.DMatrix(train_X,train_y)
        dtest = xgb.DMatrix(test_X,test_y)
        
        xgboost_model = xgb.train(param, dtrain, num_boost_round=20)
        predicted_y = xgboost_model.predict(dtest)
        
        for i in range(len(predicted_y)):
            if predicted_y[i] &gt; 0.5:
                 predicted_y[i]=1
            else:
                predicted_y[i]=0
        accs.append(accuracy_score(dtest.get_label(), predicted_y))
        pres.append(precision_score(dtest.get_label(), predicted_y))
        recalls.append(recall_score(dtest.get_label(), predicted_y))
        f1s.append(f1_score(dtest.get_label(), predicted_y))
    print('=========================================================================================')
    print('参数: ')
    print(param)
    print('准确率：', np.mean(np.array(accs)))
    print('精度：', np.mean(np.array(pres)))
    print('召回率：', np.mean(np.array(recalls)))
    print('F1：', np.mean(np.array(f1s)))
        
    if np.mean(np.array(f1s)) &gt; best_f1:
        best_f1 = np.mean(np.array(f1s))
        best_param = param

print('=========================================================================================')
print('best F1 score:', best_f1)
print('best parameter: ', best_param)
</code></pre>
<pre><code class="language-python"># 确定最优参数后用最优参数在整个训练集上训练模型
import xgboost as xgb

train_data = train_d.values
train_features = train_data[:, 1:]                       # 训练数据特征
train_labels = train_data[:, 0]                          # 训练数据标签

test_data = test_d.values                                
test_features = test_data[:,1:]                          # 预测数据特征

# 数据归一化
std = StandardScaler()
train_features = std.fit_transform(train_features)
train_labels = train_labels.astype('int')
test_features = std.transform(test_features)

dtrain = xgb.DMatrix(train_features,train_labels)
dtest = xgb.DMatrix(test_features)
# 用最优参数构建模型
param = {'max_depth': 20, 'eta': 0.3, 'subsample': 1, 'colsample_bytree': 1, 'objective': 'binary:logistic', 'eval_metric': 'logloss'}
xgboost_model = xgb.train(param, dtrain, num_boost_round=20)

# 输入没有标签的测试集特征
predicted_y = xgboost_model.predict(dtest)
for i in range(len(predicted_y)):
    if predicted_y[i] &gt; 0.5:
        predicted_y[i]=1
    else:
        predicted_y[i]=0

# 结果组合成df，保存输出结果
df_y = pd.DataFrame(predicted_y.tolist(),columns=['pre_result'])
df_u = test_d['usr_id']
result = pd.concat([df_u,df_y], axis=1)
result.to_csv(&quot;result.csv&quot;,index=False)
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[兴趣使然的《只狼》故事全解读（一）]]></title><description><![CDATA[《只狼》（Sekiro:Shadows Die Twice）确实是一款不可多得的优秀游戏，如果你喜欢动作游戏、对剧情又有一定要求，那我是无脑安利推荐给你的。]]></description><link>https://www.dbaren.com/post/sekiro-decode-1/</link><guid isPermaLink="false">60db3f10de98590001719755</guid><category><![CDATA[游戏]]></category><dc:creator><![CDATA[Aren]]></dc:creator><pubDate>Tue, 29 Jun 2021 15:49:18 GMT</pubDate><content:encoded><![CDATA[<h2 id="-">前言</h2><p>《只狼》（Sekiro:Shadows Die Twice）确实是一款不可多得的优秀游戏，如果你喜欢动作游戏、对剧情又有一定要求，那我是无脑安利推荐给你的。溢美的词不需要要太多，简单说说作为动作游戏我自认为只狼比较符合我喜好的几个点（不分先后）：</p><ul><li>画面精细，氛围感很好，可以产生良好的代入感</li><li>操作手感和打击感极佳，坦白说同门的黑魂3手感在我看来还是比不过动作天尊卡普空，但只狼这作我觉得已经可以和卡普空媲美了（指MH、DMC等老卡头部作品），至少毫不逊色</li><li>游戏的操作不复杂，整套系统属于相对简单但有深度的那种类型，近年来我特喜欢这种简单上手的游戏，太复杂的玩意我现在觉得心好累</li><li>至于剧情，实话普普通通，不过个人近年来很喜欢这种严肃认真地构造一个“世界”然后能让你产生代入感的游戏，放眼在整个游戏世界里许玩家也只是其中的一员，整个世界充满了未知、值得让人去探索、去了解。</li><li>一定的难度，没有easy模式可选，倒是可以选择更难的模式</li></ul><p>至于作为动作游戏的创新性，“打铁”这个真的是不得不提实在是太酷了，刀与刀的相拼火花四溅，在恰当的时机格挡然后迅速反击，以此把敌人的躯干（耐久）削弱尽就可以施与一击必杀（忍杀），这套动作设定实在是太有意思了，完全满足了玩家幻想中的武林高手相互交手、双方见招拆招轮番比拼，最后一击夺命的代入体验——真爽。</p><p>动作和系统就说到这里吧，毕竟解读故事才是我本文的目的，我是想着白金（全成就）后我就写一篇解读文的，但没想到拖拖拖差点都写不出来了，看了一下，全球全成就的人也就是8%，看来哥还是TOP10%的实力的（笑），我有印象的上一款游戏取得全成就貌似是6、7年前的PSV上的P4G，P5我本来想白金的，可惜烂尾了。</p><h2 id="--1">正文</h2><p>《只狼》讲了一个什么样的故事？日本的战国时期，在游戏当前的时间二十年前，苇名国的剑圣苇名一心进行了一场“窃国”的战争（说白了就是地方不想被中央统治兼并进行的独立战争），然后在当时那场战争主角只狼作为战场孤儿被其义父枭收养并培养成忍者，只狼后来被指派为苇名国分家平田氏的养子九郎的贴身护卫，因九郎拥有龙胤血脉的力量（可让人有起死回生的不死之力），成为了苇名内部二五仔的目标，三年前二五仔里应外合幕府军对平田城邑进行了入侵，只狼在当时死命护主、虽达成了任务但最终不幸丧命，所幸被主人九郎缔结了不死契约才得以存活。三年后苇名面临幕府的入侵，靠苇名弦一郎（一心的孙子）虽然可以一定程度抵挡幕府但终究亦渐处劣势，幕府虽忌惮一心，但苇名一心年事已高且患有重病，只要一心一死，幕府将全力进攻，苇名将难逃覆灭的命运——此时的弦一郎为了保护国家，希望能借助龙胤的御子、九郎的不死之力来赢得这场战争，但九郎认为不死之力是非人之力是一种扭曲的存在、且使用起死回生之力会让世人罹患龙咳病（持续咳嗽吐血并死亡）故并不愿配合弦一郎使用，因而他被“保护”（软禁）在了苇名的城邑内。游戏开始以后，只狼似废人一样被放任遗弃在城邑附近的一个地井底，因接到了一封投井的书信，重新忆起保护主人的使命（这里设定很迷，只狼三年的空白并没有交代，但无伤大雅了），他决定找回主人并带他离开苇名国，但在初次救回主人后，只狼被弦一郎赶上、交战中因不敌被削掉了一臂（或者是赢了弦一郎但被埋伏的忍者偷袭被削一臂、取决于玩家的输赢），当其醒来后已经身处寺院并被佛雕师移植了“忍义手”，因祸得福、战斗能力不降反增，为了夺回主人，只狼再一次踏上了救主之路，故事自此正式展开。</p><p>如果整理出来，确实故事看似是很简单的，但初玩的时候如果不在意，打通了游戏或许也有人觉得迷迷糊糊吧。在下笔的此刻，我也在思考这个文章应该怎么写才合适，但无奈文笔能力有限，我估计也只能写成随笔了，我的本意是通过游戏的体验总结出游戏的人和事，至少把游戏里面一些明示暗示的东西清楚地说出来，因为写本文的目的，第一就是还原游戏里面的讲述的“事实”，第二就是基于游戏的“事实”发表一下个人的感悟和看法。</p><p>那么接下来，我就肆意地穿插讲述事件和人物了：</p><p>如果梳理一下主线，我一瞬间觉得，弦一郎太难了，九郎简直可以归入二五仔范畴，国家覆灭之际，主家苇名（弦一郎）只是希望你平田氏（九郎）可以贡献出一份力量抵御外敌，在这角度上、弦一郎的要求其实合情合理，但九郎却一副圣母之心拒绝了弦一郎，理由是什么呢？——概括来讲就是：因为这种非人之力是一种扭曲的存在，它会扭曲人存在的方式（人被杀死就应该死），如果你不死，那你渐渐就会变得不是人，这种“不死”之力本身就是错误的存在，所以龙胤不止不应该用，还应该被消灭。</p><p>如果站在弦一郎、站在苇名国的角度来看，整个故事真是太惨了，龙胤之力没夺到不说，苇名的大将军鬼影部、包括弦一郎自己都被只狼砍了，作为苇名国的神子九郎和只狼的行为没有帮助到苇名也就罢、还变相加速了苇名国的灭亡。</p><p>但换位回只狼和九郎的角度，他们也没有做错，只狼只是为了营救主公还主公自由，他认为主公是正确的，并为此赌上性命，九郎认为龙胤就是祸害、为了斩断龙胤他亦不惜牺牲自己。</p><p>所以作为玩家，其实也不用想太多，这时候套用游戏里面的经典话就是——“犹豫，就会败北”，一旦选定了自己的道路，就应该贯彻到底，弦一郎如此，玩家（只狼）亦如此。</p><figure class="kg-card kg-image-card"><img src="http://img.dbaren.com/img/20210324211845_1.jpg" class="kg-image" alt></figure><p>当然，制作人并不是想刻画简单的无关善恶只在于立场的冲突，其倾向还是很明显的，就是肯定了斩断龙胤、人应该作为人活着、哪怕是为了生存、也绝不能妥协放弃作为一个“人”而活，不然一切将毫无意义。~~考虑到制作人宫崎英高是《剑风传奇》的粉丝，这一点就更加无需怀疑，因为剑风里面刻画的非人类反派，无非就是他们为了换取力量献祭作为人应该珍视之物化身为妖魔（不做人），而主角则始终展现身而为人的坚韧、绝不屈服的精神。~~我个人并不喜欢脱离作品谈作品，用作品里面的事情来说或许更好，想想所谓的实现“不死”的手段都是如何的龌龊，比如仙峰寺蜈蚣人和孩童实验、源之宫的那些达官贵人，都可以明白到，实现“不死”往往都是扭曲又丑陋的，压根不存在美好与幸福。所谓“君子爱财，取之有道”，如果本身的做法就是错的，你如何渴求得到正确的结果？</p><p>下一篇我会按照人物和地点事件一个个去解读，就先写到这吧，下次继续。</p>]]></content:encoded></item><item><title><![CDATA[骑行的愉悦，猛鸷190X]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>在上一年回家工作那会就考虑买一辆机车（男装摩托），因为逮捕令（皇家双妹麦）的关系对本田这个牌子很有好感，查了下目前本田就两款适合的：猛鸷190 or 暴风眼190，综合考虑后选择了猛鸷190，原本想着双11京东直接定购寄回当地门店，后来还是决定先去门店看看再决定。</p>
<p>当时是11.11前几天，询问了下发现我这本地的大排量摩托牌照刚好放开可以上牌，心想居然会这么巧合，看来是冥冥中有定意？留了电话，嘱托师傅如果回到了新车我过来试骑下看看。后来在11.13门店师傅就致电我说车回到了让我抽空过去看看，我第二天趁着周六去看了、可惜回到不是我原本想要的白色，本来还在犹豫，但听师傅说白色用久了会发黄，考虑了下、觉得黑色也不错，就愉悦地下定了。</p>
<p>这里插几句，排量超过150cc的摩托需要买购置税，国内的购置税是10%，但要注意的是这个税是在扣除增值税以后算的，所以一般消费者要交的税款应该是：</p>
<blockquote>
<p>要交的购置税 = 机车发票价 / 1.17 * 10%</p>
</blockquote>
<p>因为当时车行说代上牌，要收税10%，车子的发票价打低，可以少扣税就交少一点，我当时简单听了也没多想，觉得车行也算服务周到，但后来搞到有点不愉快（因为车行的做法是直接售价*10%收取、多出的部分作为上牌的人工费），当然事后我和师傅沟通后他同意再少收100解决了，</p>]]></description><link>https://www.dbaren.com/post/have-fun-with-honda-motor-190x/</link><guid isPermaLink="false">5fbccda6de9859000171973f</guid><category><![CDATA[生活]]></category><dc:creator><![CDATA[Aren]]></dc:creator><pubDate>Tue, 24 Nov 2020 09:16:50 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>在上一年回家工作那会就考虑买一辆机车（男装摩托），因为逮捕令（皇家双妹麦）的关系对本田这个牌子很有好感，查了下目前本田就两款适合的：猛鸷190 or 暴风眼190，综合考虑后选择了猛鸷190，原本想着双11京东直接定购寄回当地门店，后来还是决定先去门店看看再决定。</p>
<p>当时是11.11前几天，询问了下发现我这本地的大排量摩托牌照刚好放开可以上牌，心想居然会这么巧合，看来是冥冥中有定意？留了电话，嘱托师傅如果回到了新车我过来试骑下看看。后来在11.13门店师傅就致电我说车回到了让我抽空过去看看，我第二天趁着周六去看了、可惜回到不是我原本想要的白色，本来还在犹豫，但听师傅说白色用久了会发黄，考虑了下、觉得黑色也不错，就愉悦地下定了。</p>
<p>这里插几句，排量超过150cc的摩托需要买购置税，国内的购置税是10%，但要注意的是这个税是在扣除增值税以后算的，所以一般消费者要交的税款应该是：</p>
<blockquote>
<p>要交的购置税 = 机车发票价 / 1.17 * 10%</p>
</blockquote>
<p>因为当时车行说代上牌，要收税10%，车子的发票价打低，可以少扣税就交少一点，我当时简单听了也没多想，觉得车行也算服务周到，但后来搞到有点不愉快（因为车行的做法是直接售价*10%收取、多出的部分作为上牌的人工费），当然事后我和师傅沟通后他同意再少收100解决了，并且解释说当时是他没说清楚，这些都是他们的常规做法，一般人的车辆价格较低、所以这个金额差不了多少，差额就算做上牌的人工费——人工费其实可以理解，但如果消费者不知情，那就另一回事了。一百几十块不是出不起，如果一般人上班没时间处理，给个一百几十图个省事也是值得的。</p>
<p>本来购车后周一就可以上牌领车了，刚好要去南京出差，所以到11.21我出差回到再车行关门前迫不及待赶上提车。当然出差期间我把一些头盔和锁之类的配件都网上买好送回了家中。</p>
<p>果然现实和理想是有数据的，没买车前我想着买了这机车我就是这街上最靓的仔了，只要我手把一手油，我就让你们望尘莫及。</p>
<p>现实是……我一个不小心就死火了，这机车的离合和汽车还真有点不同，汽车是自动有怠速向前的，摩托的话需要加油门配合才能起步。我提车第二天就搭着媳妇逛了，但也路上死火2、3次，有次还是在车站边刚和一些搭客的摩托大叔聊天、大叔那边问我车怎么卖、多少cc，结果等媳妇办完事要走、劳资搭着媳妇刚起步想走就死火、好尴尬好尴尬。</p>
<p>而且我发现本田这机车有点容易拖挡，一不小心就有被扯住的感觉，还真不如自动档的女装摩托开得溜，起步都慢半拍。——不过没关系，为了帅这都不是事。</p>
<p>提车第二天就去附近的风景区逛了逛，还真挺愉悦的，平时坐在汽车里，你是很难感受到风的感觉，一旦开快、也不好领略沿途的风景。就像你坐客机，透过窗虽然你知道你是在天上但你不并觉得你在飞翔，如果能换上以前那种老旧的露驾驶舱的飞机，那感受肯定就完全不同了。</p>
<p><img src="https://raw.githubusercontent.com/lenkaren/mystore/master/img/IMG_20201122_171001.jpg" alt title="这里的景色我真的喜欢"></p>
<p>我媳妇和丈母娘说起我买机车的事，丈母娘说没想到我还想开这种车。说真我10几岁也想过骑机车了，但当然没有过于强烈的欲望，毕竟也不是说要成为车手什么的（车枪球类的游戏我基本都不碰），就是纯粹觉得挺酷的，而且可以感受风一样飞驰的感觉，如果当时背后再搭个妹子~估计能让人羡慕死，哈哈。当然哥现在出行背后搭着自家媳妇，也算是实现了年轻时的幻想吧。</p>
<p><img src="https://raw.githubusercontent.com/lenkaren/mystore/master/img/IMG_20201122_160012.jpg" alt title="沿途风光"></p>
<p><img src="https://raw.githubusercontent.com/lenkaren/mystore/master/img/IMG_20201122_171208.jpg" alt title="堤坝下城镇"></p>
<p>骑机车的学习过程中，我也感受到了明显的进步，比如更会控制离合了，因为竖不起中支架一度以为是自己身板小力气不够、结果网上搜索加上实践一个人用巧劲竖了起来、感觉棒棒，我现在是想法是练纯熟并且让车开过磨合期，看哪天有机会直接开一次去上班。</p>
<p>最后说说这车的驾驶，与汽车不太一样，个人感觉大概转速与速度的比较合理的对应关系就是：</p>
<ul>
<li>1挡10时速</li>
<li>2挡20时速</li>
<li>3挡30时速</li>
<li>4挡40时速</li>
<li>5挡50时速以上</li>
</ul>
<p><img src="https://raw.githubusercontent.com/lenkaren/mystore/master/img/IMG_20201122_171437.jpg" alt title="国四猛鸷190x还是挺帅滴"></p>
<p>车子大概是3000-4000转的引擎声音比较舒适，到5000-6000转那会引擎声音已经比较响了，5挡那会6000转大概也就是80时速。坦白说这车发动机声音我不是特别喜欢，我比较喜欢在高速形式下还可以低沉一点的那种的发动机声音，加上这车真的很容易顿挫，开快了点如果不升挡不拧油门，马上就会产生拉扯把车的速度拉扯下来。 不过没关系，如果我有更高的追求，总有一天我相信我也是可以实现的，现在就先入个门，以后的以后再说吧。</p>
<p>PS：狗东居然给我推荐20w的宝马机车，看得我眼馋，狗东你说说，我像是买得起的人嘛？哼。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[新玩具入手——华为手表GT2Pro]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><img src="http://img.dbaren.com/img/huawei_gt2_pro_20201105.jpg?imageView2/0/w/480" alt title="华为手表GT2Pro（HUAWEI WATCH GT2 Pro）"></p>
<p>前一段时间一直在找一款合适智能手表，想趁着双11入手，寻寻觅觅，始终没有太好的心仪选择，一开始专挑性价比选择，后来觉得还是要外观和质感至上，省略过程，最后在华为官网预定了<strong>HUAWEI WATCH GT2 Pro</strong>，11.2日到货。</p>
<p>我有个朋友喜欢买贵表，我曾经调侃他说：</p>
<blockquote>
<p>你买辆豪车确实可能开得比我快，你买个这么贵的表难不还能比我几十块的电子表跑得快不成？</p>
</blockquote>
<p>那现在——我自己买个两千多块的表难不成也比一百多块的智能手环要跑得更快更酷不成？嘛，快是没有了，酷一点个人觉得还算符合的。</p>
<p>讲真，这玩意真不是个必须品，硬要说解决需求的话，100多块的手环可以解决，抚心自问这是一个装饰品+实用工具+轻奢（在我看来……）的成人玩具。</p>
<p>因为我喜欢安静，办公或者很多情况下都喜欢静音手机（不然会被各种消息提醒吵死），手表的震动提醒真的帮助很大，另外就是运动的时候喜欢顺带听歌、以前还得带个手机、现在gt2pro也可以存音乐，运动可以减轻负担。</p>
<p>先列一下gt2pro提供给我的一些需求功能：</p>
<ul>
<li>电话与消息提醒，来电震动，可直接手表浏览短信内容</li>
<li>运动功能，我主要用来跑步、距离记录和心率提醒</li>
<li>装饰品，看起来要好看</li>
<li>手表的基本功能，</li></ul>]]></description><link>https://www.dbaren.com/post/about-huawei-watch-gt2-pro/</link><guid isPermaLink="false">5fa3cc69de9859000171971c</guid><category><![CDATA[生活]]></category><dc:creator><![CDATA[Aren]]></dc:creator><pubDate>Thu, 05 Nov 2020 09:59:43 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><img src="http://img.dbaren.com/img/huawei_gt2_pro_20201105.jpg?imageView2/0/w/480" alt title="华为手表GT2Pro（HUAWEI WATCH GT2 Pro）"></p>
<p>前一段时间一直在找一款合适智能手表，想趁着双11入手，寻寻觅觅，始终没有太好的心仪选择，一开始专挑性价比选择，后来觉得还是要外观和质感至上，省略过程，最后在华为官网预定了<strong>HUAWEI WATCH GT2 Pro</strong>，11.2日到货。</p>
<p>我有个朋友喜欢买贵表，我曾经调侃他说：</p>
<blockquote>
<p>你买辆豪车确实可能开得比我快，你买个这么贵的表难不还能比我几十块的电子表跑得快不成？</p>
</blockquote>
<p>那现在——我自己买个两千多块的表难不成也比一百多块的智能手环要跑得更快更酷不成？嘛，快是没有了，酷一点个人觉得还算符合的。</p>
<p>讲真，这玩意真不是个必须品，硬要说解决需求的话，100多块的手环可以解决，抚心自问这是一个装饰品+实用工具+轻奢（在我看来……）的成人玩具。</p>
<p>因为我喜欢安静，办公或者很多情况下都喜欢静音手机（不然会被各种消息提醒吵死），手表的震动提醒真的帮助很大，另外就是运动的时候喜欢顺带听歌、以前还得带个手机、现在gt2pro也可以存音乐，运动可以减轻负担。</p>
<p>先列一下gt2pro提供给我的一些需求功能：</p>
<ul>
<li>电话与消息提醒，来电震动，可直接手表浏览短信内容</li>
<li>运动功能，我主要用来跑步、距离记录和心率提醒</li>
<li>装饰品，看起来要好看</li>
<li>手表的基本功能，防水</li>
<li>音乐播放，连蓝牙耳机可在运动时听音乐而不需要带手机</li>
</ul>
<p>再列一下gt2pro其他的一些功能：</p>
<ul>
<li>无线充电</li>
<li>健康类的测量记录，心率、睡眠、压力测试、血氧饱和度等</li>
<li>通话，可以拨打联系人与接听来电（手表有扬声器和麦克风）</li>
<li>天气、气压计、指南针、手电筒</li>
<li>nfc卡模拟、支付宝条码支付</li>
<li>表盘市场，nfc碰一碰设定手机图片为表盘</li>
<li>找手机（蓝牙连接下可以响铃手机）</li>
<li>自身闹钟功能，闹钟可与手机闹钟联动、震动提醒</li>
<li>其他第三方应用</li>
</ul>
<p>我这里真的要点名——无线充电这个真的酷得不行，磁吸，无线冲，让我想起第一次用mba的磁吸充电带我的那种科技感…现在的mbp都是typec接口了。</p>
<p>广告宣传gt2pro续航可达两周，实际我使用、两三天下来用了将近40%电量，应该和我现在刚新买，各种折腾有关，但正常可能也就能用10来天左右（我查看短信比较多）。</p>
<p><img src="http://img.dbaren.com/img/huawei_gt2_pro_20201102_190149.jpg?imageView2/0/w/480" alt title="包装"></p>
<p><img src="http://img.dbaren.com/img/huawei_gt2_pro_20201105_162942.jpg?imageView2/0/w/480" alt title="戴手上还是不错的"></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Linux下的用户创建和sudo授权，以及添加ssh-keygen免密码登录]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>因为一般不直接用root用户操作，添加用户并且授权、免密登录就是一套常规操作了。</p>
<blockquote>
<p>注：环境为centos7.8,操作的初始角色root</p>
</blockquote>
<h2 id>用户创建和授权</h2>
<p>创建用户<br>
<code>adduser username</code></p>
<p>设置密码<br>
<code>passwd username</code></p>
<p>vim /etc/sudoers 进入文件编辑器，root用户wq!保存即可</p>
<pre><code>## Allow root to run any commands anywhere
root ALL=(ALL) ALL #已有行
## 增加一行
username ALL=(ALL) ALL
</code></pre>
<p>客户端键入</p>
<blockquote>
<p>ssh-keygen</p>
</blockquote>
<p>一路回车</p>
<p>服务端切换用户,创建文件</p>
<pre><code>$ su username
$ cd ~
$ ssh-keygen
$ cd .ssh/
$ vim authorized_</code></pre>]]></description><link>https://www.dbaren.com/post/linux-adduser-sudo-and-ssh-keygen/</link><guid isPermaLink="false">5fa1801a92f27e0001c353a9</guid><category><![CDATA[Linux]]></category><dc:creator><![CDATA[Aren]]></dc:creator><pubDate>Tue, 03 Nov 2020 16:22:30 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>因为一般不直接用root用户操作，添加用户并且授权、免密登录就是一套常规操作了。</p>
<blockquote>
<p>注：环境为centos7.8,操作的初始角色root</p>
</blockquote>
<h2 id>用户创建和授权</h2>
<p>创建用户<br>
<code>adduser username</code></p>
<p>设置密码<br>
<code>passwd username</code></p>
<p>vim /etc/sudoers 进入文件编辑器，root用户wq!保存即可</p>
<pre><code>## Allow root to run any commands anywhere
root ALL=(ALL) ALL #已有行
## 增加一行
username ALL=(ALL) ALL
</code></pre>
<p>客户端键入</p>
<blockquote>
<p>ssh-keygen</p>
</blockquote>
<p>一路回车</p>
<p>服务端切换用户,创建文件</p>
<pre><code>$ su username
$ cd ~
$ ssh-keygen
$ cd .ssh/
$ vim authorized_keys
</code></pre>
<p>把客户端内的 ~/.ssh/id_rsa.pub 的内容全部复制服务端的 authorized_keys 内</p>
<blockquote>
<p>ssh username@host -p22</p>
</blockquote>
<p>done.</p>
<h2 id="ssh">如果ssh连接提示无权限：</h2>
<blockquote>
<p>在本地 SSH 登录服务器，使用新创建的用户，提示：<br>
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).<br>
原因是用户主目录下的 .ssh 目录与它里面的 authorized_keys 文件的权限不能。<br>
.ssh 目录的权限应该是 700，authorized_keys 这个文件的权限应该设置成 600 。<br>
注意 .ssh 目录与 authorized_keys 的拥有者都必须是你创建的那个用户。比如我创建了一个叫 aren 的用户，那它应该是 .ssh 与 authorized_keys 的拥有者，并且必须要设置合适的权限</p>
</blockquote>
<pre><code>$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh_authorized_keys
</code></pre>
<h2 id="sudousrlocalbin">sudo 下环境变量没有加入到/usr/local/bin导致找不到命令的话</h2>
<pre><code># 修改 /etc/sudoers
# 找到
# Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

#改为
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
</code></pre>
<!--kg-card-end: markdown--><h2></h2>]]></content:encoded></item><item><title><![CDATA[Centos下通过docker搭建ghost博客]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>一些前言：</p>
<p>很早我就想搭个blog，N年前的标准答案是wordpress，撇开代码不谈，外观实在太落后了（来自外貌协会的一票否决），也轻微折腾了一下fork了一些基于laravel的博客、想着基于自己熟悉的框架也比较方便，甚至想着不如自己用go或者java全新写一个一切尽在掌握，均不了了之。</p>
<p>后来我“痛定思痛”想了下，我只是想要个美观的、功能满足需求的的博客系统，至于自定义做一些开发这种事，如果是可以动鼠标和敲命令解决的问题、我是绝对懒得写代码的。</p>
<p>于是我重新考察了一下流行的博客系统，Hexo/Ghost/Vuepress，最后我决定用Ghost，简单理由如下：</p>
<ul>
<li>默认就比较符合审美的简约风格（黑白），也可以自己换主题</li>
<li>支持移动端良好访问</li>
<li>支持markdown写法（用过md、这辈子都不想用doc）</li>
<li>支持文章评论（通过插件或者gitalk）</li>
<li>后台管理，可以选择接入数据库，也可以纯文档部署</li>
<li>资料和开发工具支撑比较完善</li>
</ul>
<p>那，决定了就安装部署呗，生产环境官方给的例子是ubuntu的安装，但我tx云用的是centos7，考虑了下我觉得不如用docker好了，毕竟docker现在来看早就是大势所趋，docker可以很好解决各种不同环境下的服务部署问题，docker既是技术力也是生产力、多学学也不亏。</p>
<h2 id>下面正式开始安装部署教程：</h2>
<p>1、更新yum</p>
<pre><code>$ yum</code></pre>]]></description><link>https://www.dbaren.com/post/install-ghost-on-centos7-by-docker/</link><guid isPermaLink="false">5f97f2c03f16150001615d43</guid><category><![CDATA[开发]]></category><dc:creator><![CDATA[Aren]]></dc:creator><pubDate>Tue, 27 Oct 2020 10:15:07 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>一些前言：</p>
<p>很早我就想搭个blog，N年前的标准答案是wordpress，撇开代码不谈，外观实在太落后了（来自外貌协会的一票否决），也轻微折腾了一下fork了一些基于laravel的博客、想着基于自己熟悉的框架也比较方便，甚至想着不如自己用go或者java全新写一个一切尽在掌握，均不了了之。</p>
<p>后来我“痛定思痛”想了下，我只是想要个美观的、功能满足需求的的博客系统，至于自定义做一些开发这种事，如果是可以动鼠标和敲命令解决的问题、我是绝对懒得写代码的。</p>
<p>于是我重新考察了一下流行的博客系统，Hexo/Ghost/Vuepress，最后我决定用Ghost，简单理由如下：</p>
<ul>
<li>默认就比较符合审美的简约风格（黑白），也可以自己换主题</li>
<li>支持移动端良好访问</li>
<li>支持markdown写法（用过md、这辈子都不想用doc）</li>
<li>支持文章评论（通过插件或者gitalk）</li>
<li>后台管理，可以选择接入数据库，也可以纯文档部署</li>
<li>资料和开发工具支撑比较完善</li>
</ul>
<p>那，决定了就安装部署呗，生产环境官方给的例子是ubuntu的安装，但我tx云用的是centos7，考虑了下我觉得不如用docker好了，毕竟docker现在来看早就是大势所趋，docker可以很好解决各种不同环境下的服务部署问题，docker既是技术力也是生产力、多学学也不亏。</p>
<h2 id>下面正式开始安装部署教程：</h2>
<p>1、更新yum</p>
<pre><code>$ yum update
</code></pre>
<p>2、删除可能存在的旧版本</p>
<pre><code>$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
</code></pre>
<p>3、安装 <code>yum-utils</code> 组件，获取稳定的docker安装包。</p>
<pre><code>$ sudo yum install -y yum-utils

$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
</code></pre>
<p>注意：<br>
有些安装教程会用下边的命令安装<code>yum-utils</code>，但个人发现centos7已经默认就启用了device-mapper和安装了lvm2，所以没必要安装那两个依赖，低版本的centos可能才需要。</p>
<pre><code>#  preinstall utils 
sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
</code></pre>
<p>4、安装docker</p>
<pre><code>$ sudo yum install docker-ce docker-ce-cli containerd.io
</code></pre>
<p>5、安装docker-compose</p>
<pre><code>sudo curl -L &quot;https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)&quot; -o /usr/local/bin/docker-compose
</code></pre>
<p>墙的关系这里很难下，我是直接本地下载了再scp传上服务器。</p>
<p>6、赋予docker-compose执行权限</p>
<pre><code>sudo chmod +x /usr/local/bin/docker-compose
</code></pre>
<p>7、启动docker、给当前用户赋权</p>
<pre><code># start deamon and enable auto start when power on
sudo systemctl start docker
sudo systemctl enable docker

# add current user 
sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo systemctl restart docker
</code></pre>
<p>8、配置ghost的docker-compose.yml</p>
<blockquote>
<p>vim docker-compose.yml</p>
</blockquote>
<pre><code>version: '3.1'
services:
  ghost:
    image: ghost:3.36-alpine
    restart: always
    container_name: ghost
    ports:
      - 2368:2368
    depends_on:
      - mysql
    links:
      - mysql
    environment:
      database__client: mysql
      database__connection__host: mysql
      database__connection__user: root
      database__connection__password: xxxxyyyy
      database__connection__database: ghost
      url: https://www.dbaren.com
    volumes:
      - ./ghost-data:/var/lib/ghost/content
    network_mode: bridge
  mysql:
    image: mysql:5.7
    restart: always
    container_name: mysql
    volumes:
      - ./mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: xxxxyyyy
    network_mode: bridge
</code></pre>
<p>启动：</p>
<p><code>$ docker-compose up -d</code></p>
<p>9、安装配置nginx代理2368端口</p>
<p><code>$ yum install nginx</code></p>
<p><code>$ sudo touch /etc/nginx/conf.d/blog.conf</code></p>
<pre><code>server {
    listen 80;
    server_name www.dbaren.com;
    client_max_body_size 50M;
    access_log  /var/log/nginx/dbaren.com.access.log  main;
    error_log /var/log/nginx/dbaren.com.error.log     warn;

    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host $http_host;
        proxy_set_header   X-Forwarded-For $remote_addr;
        proxy_set_header   X-Forwarded-Proto https;
        proxy_connect_timeout   30;
        proxy_read_timeout      30;
        proxy_send_timeout      30;
        proxy_pass http://127.0.0.1:2368;
    }
}
</code></pre>
<p>10、配置highlight.js优化代码显示</p>
<p>Code injection -&gt; Site Header</p>
<pre><code>&lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.3.1/styles/darcula.min.css&quot; integrity=&quot;sha512-0+Gq7jQLhuoMdL8EednGo8delKMhKim1t3XrvVGTqbJPfyv5f4HUJ0DTEN+3E+aM4RGEEfmVJOiomnP9olm4iw==&quot; crossorigin=&quot;anonymous&quot; /&gt;
</code></pre>
<p>我这里用的高亮主题是darcula，可以按自己需要的选的：<a href="https://cdnjs.com/libraries/highlight.js">highlight.js</a></p>
<p>Site footer</p>
<pre><code>&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.3.1/highlight.min.js&quot; integrity=&quot;sha512-U12+KlhI3X2EY7U4NJZ+O0wujKcaMQZHABtaiZtE8UrPiK1O3Y4cjBe0mMFyyBptdaf+eh45hqNdsayeLQcneg==&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;script &gt;hljs.initHighlightingOnLoad();&lt;/script&gt;
</code></pre>
<p>参考资料：</p>
<p><a href="https://ghost.org/docs/setup/">官方的安装文档</a></p>
<p><a href="https://www.itsfun.top/writing-with-ghost/">不折腾了, 决定使用Ghost写博客</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[给ghost添加gitalk评论功能]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>虽然有墙的关系github访问是不太行，但终究还是喜欢gitalk的方案来实现评论功能，<a href="https://gitalk.github.io/">Gitalk Demo</a> &amp; <a href="https://github.com/gitalk/gitalk">Gitalk</a></p>
<p>前置准备：</p>
<ul>
<li>github帐户，没有可<a href="https://github.com/signup">创建</a>；</li>
<li>github repository，用于保存评论（issues），没有可<a href="https://github.com/new">创建</a>；</li>
<li>github application授权，没有可<a href="https://github.com/settings/applications/new">创建</a>。</li>
</ul>
<p>进到Ghost后台 &gt; Settings &gt; Code injection，在Site Header增加以下代码：</p>
<pre><code class="language-html">&lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.css&quot;&gt;
&lt;style</code></pre>]]></description><link>https://www.dbaren.com/post/gei-ghosttian-jia-gitalkping-lun-gong-neng/</link><guid isPermaLink="false">5f97af07c57cfe0001de292c</guid><category><![CDATA[开发]]></category><dc:creator><![CDATA[Aren]]></dc:creator><pubDate>Tue, 27 Oct 2020 05:25:54 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>虽然有墙的关系github访问是不太行，但终究还是喜欢gitalk的方案来实现评论功能，<a href="https://gitalk.github.io/">Gitalk Demo</a> &amp; <a href="https://github.com/gitalk/gitalk">Gitalk</a></p>
<p>前置准备：</p>
<ul>
<li>github帐户，没有可<a href="https://github.com/signup">创建</a>；</li>
<li>github repository，用于保存评论（issues），没有可<a href="https://github.com/new">创建</a>；</li>
<li>github application授权，没有可<a href="https://github.com/settings/applications/new">创建</a>。</li>
</ul>
<p>进到Ghost后台 &gt; Settings &gt; Code injection，在Site Header增加以下代码：</p>
<pre><code class="language-html">&lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.css&quot;&gt;
&lt;style type=&quot;text/css&quot;&gt;
&lt;!-- 下面的代码是改变评论框内的背景颜色的，ghost默认的主题下gitalk的评论框文字白色、背景也是白色会导致文字看不清 --&gt;
.gt-container .gt-header-textarea {
	background-color: #24292e;
}
.gt-container .gt-header-textarea:hover {
    background-color: #303a3e;
}
</code></pre>
<p>再在Site Footer增加以下代码（按自己情况改下参数配置）：</p>
<pre><code class="language-html">&lt;!-- gitalk --&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
    var gitalkDiv = document.createElement(&quot;div&quot;);
    gitalkDiv.setAttribute(&quot;id&quot;, &quot;gitalk-container&quot;);
    if(document.querySelector('.read-next')){
    	document.querySelector('.read-next').appendChild(gitalkDiv)
    }
    
    var gitalk = new Gitalk({
      clientID: 'github application的clientID',
      clientSecret: 'github application的clientSecret',
      repo: 'repository的名称',
      owner: 'repository的拥有者',
      admin: ['允许创建评论issue的github账户'],
      id: location.pathname,      // Ensure uniqueness and length less than 50
      distractionFreeMode: false  // Facebook-like distraction free mode
    })
    
    gitalk.render('gitalk-container')
&lt;/script&gt;
</code></pre>
<p>后话：直接把clientID和clientSecret暴露在js代码的做法总觉得不安全。</p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>