朝简单处想 往认真处行


  • 首页

  • 标签

  • 分类

  • 归档

Linux 集群上文献信息的爬虫和下载

发表于 2020-06-13
字数统计: 1.7k 字 | 阅读时长 ≈ 7 分钟

写在开头:

几年的 科研工作 搬砖经历,不得不和文献打交道,不论是自己读还是做成文档给别人讲,一般都会需要获取文献某些信息如题目,杂志名称,影响因子,一作,通讯以及下载文献原文等,而常规(以往的自己)的做法是,搜索 - 复制 - 粘贴 - 下载(以及 for 循环这个过程),其实很烦很枯燥很无聊很费时间(那你以前是怎么忍下来的…),应该把这部分时间节省下来做其他重要的事情,比如睡觉和发呆 +.+

最近因为工作的刚需以及加上同事的鞭策,我写了一个程序,只需要输入 DOI 就可以做到上边提到的事情,两个脚本:

  1. advanced_paper_informational.py, 用来在 Linux 环境下提取文献信息;
  2. scihub.py,用来下载文献;

1. advanced_paper_informational.py

这个脚本需要两个输入文件:

  1. IF_2019.txt 影响因子文件,每年都会更新,以后下载更新即可;
  2. J_Medline.txt,NCBI 的杂志缩写和全称对应文件;

一些软件和相应的库:

  1. python3 以及相应的库包括 selenium; bs4;
  2. PhantomJS,在 linux 用来模拟浏览器,我本来想用 chromedriver 来着,结果没有在集群上安装成功;

这些东西安装成功以后需要添加至环境变量。

成功以后你可以用单独的 DOI 或者 DOI 的文件(换行符分割)批量查询。

这个脚本的原理简述如下:根据文献的 DOI(唯一标识),使用脚本模拟浏览器去 PubMed 检索,根据检索结果提取信息即可,下边是代码:

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
from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.webdriver import ActionChains
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.keys import Keys
import time,os,re

# set pars
import argparse,re,os,math,glob
parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
description='''
-------------------
Simple Introduction:
Crawl the information of paper... You should provide the DOI or a file for DOI (line breaks).
Example: python3 advanced_paper_informational.py -l 10.1016/S0140-6736(19)32319-0
python3 advanced_paper_informational.py -f doi_file
To be continued.
------------------'''
)
parser.add_argument('-l','--onedoi', nargs='?', help = "DOI information.")
parser.add_argument('-f','--filelist',nargs='?', help = "the DOI information list file.")
parser.add_argument("-v", "--version",action='version', version='%(prog)s 1.0')
args = parser.parse_args()
var = args.onedoi
files = args.filelist

## define the user(linux) and abbreviatio for print
import re
Dict = {'zhangSan':'ZS', 'LiSi':'LS'}
import os
user_full = os.popen('whoami').readlines()[0].strip()
if user_full in Dict:
user = Dict[user_full]
else:
user = user_full

# doi information
doi_list = list()
if var:
doi_list.append('DOI: ' + var)
if files:
with open(files, 'r') as IN:
Input = IN.readlines()
doi_list = ['DOI: ' + x.strip() for x in Input]

# out file
out = open('paper_information.xls', 'w')

## scraping
print(user_full + ' is crawling... \nThe warning information appeared later does not matter. \nIt may need some time, please wait patiently:)\nIf there is no output for a long long time, you should stop it and try to run again.\n')

browser = webdriver.PhantomJS() # 因为集群环境我只能用 PhantomJS。
url = 'https://pubmed.ncbi.nlm.nih.gov/'

# 杂志名称全称
j_name = dict()
with open('files/J_Medline.txt', 'r') as IN:
for line in IN:
line = line.strip('\n')
if line.startswith('JournalTitle'):
if re.search(' \(.*\)', line):
match = re.search('JournalTitle: (.*) \(.*\)', line)
else:
match = re.search('JournalTitle: (.*)', line) # ncbi 是缩写,然后影响因子是全称,所以得找到这个信息
#发现有带(London, England)这种信息的。。。。
full = match.group(1)
if line.startswith('MedAbbr'):
match = re.search('MedAbbr: (.*)', line)
abbr = match.group(1)
if line.startswith('NlmId'):
j_name[abbr] = full

# 杂志 IF
import pandas as pd
dt = pd.read_table('files/IF_2019.txt', index_col = 1)
IF_dict = dt['Journal Impact Factor'].to_dict()

for x in doi_list:
DOI = x
browser.get(url)
print("\nThe pubmed url is opening correctly.\n")
time.sleep(3)
try:
browser.find_element_by_xpath('//*[@name="term"]').send_keys(x)
time.sleep(2)
except NoSuchElementException:
print('AO, something wrong...')

browser.find_element_by_xpath('//*[@class="search-btn"]').click()
time.sleep(2)
print("\nThe page for paper " + x + " is opiening correctly.\n")
soup = BeautifulSoup(browser.page_source, "html.parser")

# journal name abbr
journal = soup.find(id = "full-view-journal-trigger").get_text().strip()

# title
title = soup.find(class_ = "heading-title").get_text().strip()

# IF
for x in IF_dict:
match = re.search('^' + j_name[journal] + '$', x, flags=re.IGNORECASE) # 有的名字包含其他杂志的全称...
if match:
IF = IF_dict[x]
journal_name = j_name[journal]
else:
match = re.search('^' + j_name[journal].replace('.','') + '$', x, flags=re.IGNORECASE) # 有的杂志匹配出来的全称多了个点:Nature reviews. Immunology
if match:
journal_name = j_name[journal].replace('.','')
IF = IF_dict[x]


# 发表时间
if soup.find(class_ = "secondary-date"):
p_time = soup.find(class_ = "secondary-date").get_text().strip().strip('Epub ').strip('.')
else:
p_time = soup.find(class_ = "cit").get_text().split(";")[0]

# PMID
PMID = soup.find(class_ = "current-id").get_text()


#原文链接
doi_info = soup.find(class_ = "identifier doi")
http = doi_info.find(class_ = "id-link")['href'] # 增加这一步是因为偶尔会出现 NCBI 的链接

# 一作和通讯
authors = soup.find(class_ = "authors-list").get_text().strip().replace(u'\xa0', '').replace(u'\xa0', '').replace(' ', '')
author_list = re.sub('\n\w*', '', authors).split(',')
first_author = author_list[0]
corresponding_author = author_list[-1]

# 第一单位
affiliations = soup.find(class_ = "affiliations").get_text().strip()
affiliations = re.sub('[ ]+', ' ', affiliations)
affiliations_list = re.sub('[\n]{2,}', '', affiliations).split('\n')
first_affiliation = affiliations_list[1].lstrip(' 0123456789')

line = '\t'.join([user, title, journal_name, p_time.replace('.', ''), PMID, DOI, http, IF, first_author, corresponding_author, first_affiliation])
print(line, file = out)
print('\n' + line + '\n')

out.close()
print("\nDone!, the output is paper_information.xls.\n")

2. scihub.py

写完上边这个脚本以后,我就在想:都到这一步了,为啥不临门一脚把文献下载也给搞定了呢? 于是 Google 检索了下,发现 Github 上竟然有现成的,本着不重复造轮子的偷懒精神,我就拿过来稍微改动了下,因为不是我写的,就不好意思贴代码了,改动的地方有两个:

  1. 代码中一个用来爬取可用的 sci-hub 的网址失效了,我替换了一个新的;
  2. 以及去爬这个新的网址的时候,有时候会打不开,我增加了失败后重复爬取的功能,免得需要重复运行;

这个脚本需要软件和相应的库:

  1. Python3 以及 requests, retrying, pysocks, bs4;

这个脚本还有利用谷歌学术查询文献的功能,不过我暂时还没用到,只用到了下载的功能,目前支持每次下载一个文献,等我后边有时间再修改一下。

下载的原理简述: 以 DOI 为例,程序得到一个 DOI 后,去寻找目前所有可用 sci-hub 网址,然后利用 sci-hub 网址 + DOI 得到相应的原文网页,如果是判断格式为 PDF 的话就直接保存。

Paper_information.sh

这个脚本用来整合的,因为不想单独运行两个脚本。

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/bash

# doi
python3 advanced_paper_informational.py -l "10.1016/S0140-6736(19)32319-0"

# doi file, a list of doi, line break
#python3 advanced_paper_informational.py -f doilist.txt

# dowload the pdf, only support one doi in current version +.+, TBD
python3 scihub.py -d "10.1016/S0140-6736(19)32319-0"

参考链接

  1. Bioinformatics/README.md at master · Nonewood/Bioinformatics · GitHub
  2. scihub.py/scihub.py at master · zaytoun/scihub.py · GitHub
  3. Linux下Python3环境安装selenium跟phantomjs_徐代龙的技术专栏-CSDN博客_linuxpythonphantomjs
  4. python的retrying库处理尝试多次请求 - 简书
  5. 【Python3.6爬虫学习记录】(七)使用Selenium+ChromeDriver爬取知乎某问题的回答_子耶-CSDN博客_chromedriver爬知乎
  6. python - Selenium testing without browser - Stack Overflow
  7. 实战(二)轻松使用requests库和beautifulsoup爬链接 - 掘金

写在最后

  1. 写这个程序写得很开心 🥳;
  2. 脚本还很粗糙,使用过程中可能会遇到问题,后边会在 Giuhub 修改;
  3. 我只在 Linux 上做了测试,是可行的,其他的不一定,我有时间的话,会把非 Linux 的倒腾一下,然后放出来,不过得看时间;
  4. 本来还想尝试可视化,比如弄个网站或者小程序什么的,结果发现还是挺复杂的,暂时放弃,后边看情况吧;

Linux 集群安装 HUMAnN 3.0

发表于 2020-06-07
字数统计: 284 字 | 阅读时长 ≈ 1 分钟

HUMAnN 3.0 官方链接

http://huttenhower.sph.harvard.edu/humann3
https://pypi.org/project/humann/#files

安装过程以及代码

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
# 测试了 conda 安装,但是使用了各种镜像都失败了... 可能是集群网络的问题
conda install humann -c biobakery --prefix=/YourPath/

# 测试 pip 安装, 即使加了各种镜像网址,依然失败...
pip3 install humann

# 尝试源码安装
wget https://files.pythonhosted.org/packages/9d/57/08aa836c56651f0a4e03f5883860a803bc4aabb2d1357df5f0d6f0841edf/humann-3.0.0a2.tar.gz

# 解压之后运行,安装程序
python3 setup.py install --prefix=/YourPath/humann-3.0.0a2

# 安装之前如果有一些依赖的软件已经装好了,可以提前加到环境变量里,不然会重新安装...
# 比如 Bowtie, diamond 等
export PATH=/SoftwarePath/bin:$PATH

#使用, 需要将一些软件添加至环境变量,并且测试
export PYTHONPATH=/YourPath/humann-3.0.0a2/lib/python3.6/site-packages:$PYTHONPATH
export PATH="/YourPath/Python-3.6.1/bin/":$PATH
export PATH=/YourPath/humann-3.0.0a2/bin:$PATH
humann_test

#安装数据库,整个数据库大约 40G;
humann_databases --download chocophlan full humann_dbs
humann_databases --download uniref uniref90_diamond humann_dbs
humann_databases --download uniref90_ec_filtered_diamond humann_dbs
humann_databases --download utility_mapping full humann_dbs

参考链接

Anaconda 国内镜像源整理
更改pip源与conda源至国内镜像,显著提升下载速度

拐杖和稻穗

发表于 2020-06-06
字数统计: 1.4k 字 | 阅读时长 ≈ 4 分钟

写在开头:去吃饭的途中想出来一些话,是关于「道理和讲道理」:

首先,和道德一样,道理只能用来约束自己,而非用来「指导」别人。若是因为「讲道理」而让别人不悦或者和人发生冲突,其实是没明白道理的表现,因为真正懂得道理的人,自然会知道如何将道理以合适的方式表现。有些人看似在给别人讲道理,实则是为了满足自己的虚荣心,有时候还会气急败坏,恼羞成怒;

其次,道理不能通过「听」而获得,只能自己寻找和领悟,所以你也没有讲的必要;

再者,知道了道理并且尝试去实践而发现没有发挥用处(或者发现别人这样),也不要奇怪,这就像好多物理公式的设定是无摩擦的世界,而现实生活中到处都是阻力,为什么期望你知道的道理能一直匀速行驶下去呢?

所以,自己不一定懂,别人不一定能悟,即使知道也不一定能实践成功,实在没有「讲道理」的必要,交流还是可以的。

以下是正式的笔记,这次是三封信。

第十二封 地狱里住满了好人

那些谴责我贪婪的人都说错了,事实上我喜欢的并不是钱,而是赚钱的过程,我喜欢的是胜利之后那种美好的感觉。

1918年8月11日 (此时老约翰80岁,小约翰45岁)

第十三封 天下没有白吃的午餐

如果你想要让一个人残废,你只要给他一副拐杖,然后再等一段时间就能达到目的;
换句话说,如果在一定的时间当中,你能给一个人提供免费的午餐,那么他就会养成不劳而获的习惯

路过: 这封信里还讲了个老人抓野猪的故事,就是一边给野猪提供食物让野猪不劳而获,放松警惕,一边建造围栏,最后把野猪给捉住了。

《智慧之书》的第一章,也是最后一章,就是“天下没有白吃的午餐”。如果世间的人们都知道想要有所成就,就要努力工作的道理,这个世界就会变得更加的美好,而那些企图白吃午餐的人,迟早会付出该有的代价。

路过:就好像,家畜会被用来宰掉,动物园会用来观赏,宠物稍微好些,毕竟至少表面上是以爱的名义,但是总会付出一些代价。

1911年3月17日 (此时老约翰73岁,小约翰38岁)

第十四封 做傻的聪明人

书本上的知识终究只是知识,除非你能够将这些知识付诸行动,不然什么事情都可能会发生,而且,教科书上的知识,基本上都是那些知识匠人躲在象牙塔里编纂出来的,它很难帮助你解决实际的问题。

路过:钱钟书说,“假如你吃了个鸡蛋,觉得不错,何必要认识那下蛋的母鸡呢?” 但是我觉只是品尝的话,确实没必要知道,你要想自己也下个类似的蛋(知识的实践),最好研究一下蛋是怎么来的。类似的,如果有人想给你建议,以及所谓人生的指导(很多人爱这样做),你也最好观察一下这个人的生活是什么样子的 ,如果对方的生活不是你想要的和敬佩的,你又何必听从他的建议,走在错误的道路上呢。反之,不要轻易给别人建议,用交流的态度更为稳妥些。

也许你会嘲笑我,认为没有什么比想要吃苦更加愚蠢的事情了。不,没有经历过不幸的人,才是最大的不幸。很多事情都是来得快去得快,那些一夜成名,一夜暴富的人,很多在极短的时间当中就销声匿迹了。

路过:「求学之道无坦途,问艺之路无捷径。」

哪怕是一头猪被人夸奖一番,它都能够爬到树上。

没有知识的人没有什么作为,但是有知识的人很有可能最后成为知识的奴隶,每个人都要知道,一切的知识都会转化成为一种先入为主的观念,结果形成了一种保守的心理,认为“我懂了,我知道了,社会原本就是这样的”.

装傻能够给你带来的好处还有很多,这里装傻的含义,其实是摆低自己的姿态,让自己学会谦虚,换句话来说,就是不要将你的聪明表现出来。越是聪明的人就越有装傻的必要,因为就像那句话说的那样,越是成熟的稻子,越会垂下自己的稻穗。

路过:反过来,西班牙谚语,炫耀什么说明缺什么… 「马蹄铁之所以发出声响,是因为少了一个钉子。」

我做事的时候有个习惯,就是在做出任何决定之前,先冷静地去思考,但是一旦做出任何决定的时候,就要义无反顾地坚持到底,我相信你一定能够做到。

1890年10月9日(此时老约翰52岁,小约翰17岁)

写在结尾:三封信,小约翰最小 17 岁(此时老约翰 52 岁),最大 45 岁(此时老约翰 80 岁),这种父子之间的交流和陪伴… 觉得挺好的。

2020年6月6日 下午7:31 @SZ

Linux 集群安装 MetaPhlAn3.0

发表于 2020-06-04
字数统计: 233 字 | 阅读时长 ≈ 1 分钟

官方链接

https://github.com/biobakery/MetaPhlAn/tree/3.0

按照官方教程使用 conda 进行安装。

安装代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 需要能够连接网络的集群环境
# 安装命令,指定安装目录
conda install -c bioconda metaphlan --prefix=yourpath/

# 由于某些原因,会发生报错:ondaHTTPError: HTTP None None for url <https://conda.anaconda.org/bioconda/linux-64/repodata.json>
Elapsed: None

An HTTP error occurred when trying to retrieve this URL.
HTTP errors are often intermittent, and a simple retry will get you on your way.
ProxyError(MaxRetryError("HTTPSConnectionPool(host='conda.anaconda.org', port=443): Max retries exceeded with url: /bioconda/linux-64/repodata.json (Caused by ProxyError('Cannot connect to proxy.', timeout('timed out',)))",),)

# 解决办法如下:修改 home 目录下的 .condarc 文件如下,详细参考下边的链接
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
show_channel_urls: true

如果不行,按照参考链接设置其他的镜像链接

参考链接

CondaHTTPError: HTTP None None for url
conda httperror http none none for url none Anaconda更新失败

欺骗与贪心

发表于 2020-05-30
字数统计: 1.4k 字 | 阅读时长 ≈ 4 分钟

对与错之间有很空旷的地方,知和行也是…

第十封 忠诚于自己

事实上,我渴望能够收获友谊、真诚、善良以及一切能够滋养我内心的美好情感,我也相信这些情感是一定存在的,然而非常遗憾的是,在追逐名利的商场当中,我很难得到这样的满足,却常常遭受到出卖甚至欺骗的打击。直到今天,我还能清楚地记得那些被骗的经历,是那样的刻骨铭心。

我只有在能确定对自己有利无害的情况之下,才会表现出自己的感情;我能够让对手教导我,但是我永远都不教导对手,不管我对那件事有多么了解。
做事情不要理会别人的催促,要学会三思而后行,不考虑周全的话绝对不要行动;
我有自己的真理,只对自己负责;

路过:善良不一定意味着要被欺负,保持警惕或者戒心也不意味着不真诚,而是因为这个世界是复杂和多样的,我只希望把那些美好品质用到对的人和重要的人身上,毕竟时间和精力都有限。

1899年11月29日(此时老约翰61岁,小约翰26岁)

第十一封 贪心大有必要

在人的本性当中存在着这样一种力量,一种因缺少意志力和缺少能力而生的力量,这种力量的名字叫作嫉妒。

当你有一天超越他们的时候,他们就会嫉妒你,甚至采用一些具有贬义的字眼去指责你,甚至依靠编造一些谎言的方式去诋毁你。
…
你远远不如他们的时候,生活潦倒不堪的时候,他们又会嘲讽你,讥笑你的无能,甚至会将你贬低得失去做人的尊严,我的儿子,这就是丑陋的人性。

路过:这不就是键盘侠吗,说到这个我觉得我应该多增加点儿线下的活动,减少网络对我的现实影响,不然感觉会脱轨…

绅士是永远都不会和无知的人争辩的,我同样不会和那些恭维我贪心的人论战,但是我内心当中控制不住蔑视他们的情绪。

我们冷静地回溯历史,检视人类前进的步伐,我们不难得出这样的结论:没有任何一个社会不是建立在贪心之上的,那些一直在诋毁着我的人,看着像是道德的守护者,但是其实他们内心当中哪个人不希望独占一些东西?又有谁不想控制每个人都需要的一切,虚伪的人总是那么多。

我相信,直到未来,不贪心的人仍然会是这个地球当中的稀有者,试问谁会停止对于美好事物的追求和占有呢?

如果你想要成就财富,创造出非常人生的话,我的感受,已经不再是“贪心是件好事”那么简单的了,而是贪心这件事情大有必要。

那些爱八卦的人,总是把贪心当成恶魔。可是对于我来说,打开贪心这道门,并不等于打开了潘多拉的盒子,释放出了无时无刻不在跳动着的贪心,这就像是释放你内心当中的潜能。

在刚刚开始的那段时间当中,我事事亲力亲为,整天都在忙碌着。我指挥着炼油,组织着铁路运输,想各种各样的方法来节省成本,来扩充我的石油副产品市场。我永远都忘不了那段忍饥挨饿、夜以继日拼搏的日子。

我的儿子,命运是靠自己去开创的,想要的东西一定要想方设法地去得到。

你的父亲永远都不会让你觉得羞愧,装在我兜里的每一分钱都是我辛苦赚来的,它们是干净的。我之所以能够成为富人,是我强烈事业心的回报。我坚信着上帝能够赏罚分明,我的钱是上帝给我的,而我之所以一直能够赚到钱,这是因为上帝知道我会将钱返还给社会,造福我的同胞们。

路过:上篇我引用的有类似的表述:「天下事无所为而成者极少,有所贪有所利而成者居其半,有所激有所逼而成者居其半。」,这里的贪其实说的是自己做事情的原动力。想清楚自己到底想要什么很重要,比如你想要成为什么样的人? 你想得到什么样的人生? 过上什么样的生活?拥有多少财富?期望什么样的伴侣? 如果没搞清楚的话,人生也可能会稀里糊涂的(也不是说这样不好.. 各有所好吧)。

忽然想到最近有「佛系青年」的说法,其实我觉得不应该是对啥都无所谓,对啥都不在意,真正的佛是抛掉那些杂七杂八的事情,留白,腾出来空间做自己想要做的事情,也就是自己「贪心」想要得到的东西。

1918年5月6日 (此时老约翰80岁,小约翰45岁)

总结一下:

  1. 欺骗和伤害难免会发生,一定要保护好自己,只有自己才靠得住;
  2. 想要做成某件事情,贪心(原动力)必不可少。

2020年5月30日 下午10:50 @SZ

使用 Cytoscape 画网络互作

发表于 2020-05-29 | 分类于 metagenomics
字数统计: 1.1k 字 | 阅读时长 ≈ 4 分钟

一、写在开头

因为项目的原因,必须得画网络互作图,之前一直想用脚本实现,不想手动在可视化的软件界面(因为觉得麻烦),但是又一直找不到合适的,即使找到了也不知道怎么用于我目前项目的数据,就一直拖着。

后来看到好多文献都是用 Cytoscape 这个软件画,我想,那行吧,我学习一下,就利用同事的教程生成了配置文件然后请教了一些问题(特别感谢),花了不少的时间终于鼓捣出来了,虽然结果依旧不美观,但是至少有产出了。

写这个文档,是因为后来发现自己年纪大了,总是有忘记事情的倾向,如果不做记录,隔一段时间不用了,肯定马上就忘了,所有后来总是有记录的习惯,脚本也好,日记也好,技术文档也罢。下边是正式的记录内容:

二、网络互作图简易教程

  1. 生成 Edges 和 Nodes 文件,两种文件格式如下(同事脚本生成的):
    Edges 文件列名: Source Target Correlation LineWidth LineColor
    Nodes 文件列名:Node NodeFontFace NodeSize NodeColor

  2. 导入文件
    Edges 文件导入方法:File -> Import -> Network from File
    Nodes 文件导入方法:File -> Import -> Table from File

  3. 设置格式
    Style 里可以选择默认的网络图模板;
    Node 和 Edge 可以分别设置节点和边的属性;

  4. 布局(拖)网络互作图
    可以删除一些和任何其他节点没有相关性的点,工具栏 Layout 可以选择各种 Layout,因为要看不同门的属水平的网络互作情况,我用的是 Layout -> Group Attributes Layout -> 列名(我的是 Node color , 因为按照不同的门给的颜色),另外在 Mac 上可以 按住 cmd + 触摸板 选择多个进行同时拖动(我过了好久才弄明白)…

  5. 如何设置让节点其他网络图相同的位置相同?
    Layout -> Copycat Layout 就可以选择了,如果没有的话可以去 Apps -> App Manager 下载相应的工具, App Manager 还有其他许多的工具可以下载使用,我还没有尝试太多其他的。

  6. 如何分析网络互作图,比如计算点度中心性(degree centrality),接近中心性(closeness centrality)之类的数据 ?
    Tools -> NetworkAnalyzer -> Network analysis -> Analyze Network -> Treat the network as undirected (我的网络图是无向的)
    然后就可以在下边的 Table Panel 看到关于 Node 和 Edge 的各种计算得出的信息了。

  7. 后续分析以及可视化(比较不同的网络图)
    可以分析共有的节点和特有的节点,这个可以使用 Venn 图或者 Upset 这个包;
    也可以比较衡量网络互作图的各种属性的值,比如接近中心性(closeness centrality);
    也可以比较两种网络图相关性值的分布,我画了箱线图,发现一个组的相关系数和另外一组的显著差异;
    以及其他的。

附:如何用 upset 画图?
1)首先用 python 生成画图的文件, 格式是:行名是边,列名是分组,中间是 0,1 代表有无。

1
2
3
4
5
6
7
8
9
10
# 生成画 upset 的文件, 
se = pd.DataFrame(columns=['CS', 'NS']) # 创建一个数据框
edge = list(set(list(dt['edge']) + list(df['edge']))) # 所有的 边的对
cs_edge = [1 if x in list(dt['edge']) else 0 for x in edge] # 生成 0,1,下同
cs_edge
ns_edge = [1 if x in list(df['edge']) else 0 for x in edge]
se['CS'] = cs_edge
se['NS'] = ns_edge
se.index = edge
se.to_csv('edge.xls', sep = '\t')

2)然后再用 R 的包画图(比较简单):

1
2
3
4
5
6
7
8
library("UpSetR")
pdf("upset.pdf", width=3,height=3)
gene <- read.csv('edge.xls', header = T, sep = '\t')
upset(gene, order.by = "freq",
mb.ratio = c(0.70, 0.30),
#point.size = 2, line.size = 1,
sets.bar.color=c("#24abe1", "#f3796f"), mainbar.y.label = "Edges Intersections", sets.x.label = "Edges Size")
dev.off()

3) 最后竖起你的大拇指,夸自己一下,完成撒花。

三、参考资料

https://kateto.net/tutorials/
谁是社会网络中最重要的人? - 知乎
Draw Venn Diagram
Hacking our way through UpSetR | R-bloggers
https://cran.r-project.org/web/packages/UpSetR/vignettes/basic.usage.html

四、联系方式

我想适当开放一下,可以通过以下方式联系我,但是不保证解决问题.. (因为菜)
邮箱: Pengzai16@gmail.com

第九封 信念是金

发表于 2020-05-23
字数统计: 2.1k 字 | 阅读时长 ≈ 7 分钟

写在开头:又是一封很戳我的信。

我觉得你说得很对,雄才大略的智慧能够创造出奇迹。可是,现实却是能够创造奇迹的人太少了,更多的人则是泛泛之辈。

令人值得寻味的是,人人都想要有大作为,每个人都想要获取到很好的收获,每个人都不喜欢依靠巴结别人过着平庸的生活,也从来没有人喜欢觉得自己是个不入流的人物,或者觉得自己是被迫进入到这种状况的。

路过:有这些想法的人有一大堆,你没什么特别的;一些人可能连这些都没有,仍旧没什么特别的。

难道我们真的是因为没有雄才大略么?不对,最为实用的成功智慧早就写在了《圣经》当中,那就是“坚定不移的信念能够移山”。可是就算是知道,为什么还是有那么多的失败者呢?我想,那是因为能够坚信自己能够移山的人并不是那么多,结果最终能够做到的人也不多。
绝大多数人都将那句圣言当成一个笑话,认为那是根本不可能实现的。我觉得这些执迷不悟的人犯了一个常识性的错误,他们错误地将信心当成了“希望”。没错,我们不能用希望去移走一座高山,不能依靠希望获取到成功,也不能依靠希望取得财富甚至地位。

路过:这几句话,连起来翻译成最近的现代话就是:知道了那么多道理,依旧过不好这一生。 (也不想想问题是不是出在自己身上..) 。哦,对了,补充一句,根据「词汇心理倾向」,你要是总是念叨这句话的话,你肯定过不好这一生,不信去试试。

信心所产生的是一种我坚信自己能够做到的态度,相信我能够做到的态度则能产生出必备的能力、精力以及技巧。每当你坚信自己能够做到的时候,自然就会想出相应的解决方法,成功就诞生在成功解决问题之中,这就是信心发挥力量的时候。

路过:我也赞同开始之前假定自己做到或者做不到,这两种心态很影响事情的走向。不过话是这么说,个人觉得有时候自己很难给自己那么大的信心。怎么解决呢,曾国藩同学说过一句话「天下事无所为而成者极少,有所贪有所利而成者居其半,有所激有所逼而成者居其半。」逼自己一把,比如项羽同学破釜沉舟的事情。

我从来不相信失败是成功之母,我只坚信信心是成功之父,胜利其实是一种习惯,而失败其实也是一种习惯。如果想要获得成功的话,就一定要取得持续性的胜利,我并不喜欢取得单独的胜利,我要的是持续性的胜利,只有这样我才能成为真正的强者,是信心激发了我成功的动力。

路过:想到了王小波同学在说服外甥时说的话「别人的痛苦才是你的艺术源泉,而你去受苦,只会成为别人的艺术源泉。」 同理:你的失败可能会变成别人成功的妈妈,可以,但是没这个必要。

曾经和许多在生意当中失败的人谈话,听过无数失败的理由和借口。这些失败者在同我交谈的时候,经常无意中提到的几句话是:“老实说,我并不认为这个主意行得通。”“我在事情还没有开始之前就已经感到不安了。”“我并没有对事情的失败感到惊讶。”

路过:这就是上文的「词汇心理倾向」(我自创的)。

如果你是抱着暂且试试看,不知道结果到底是好是坏的态度,最后的结果一定会是失败。不自信,是一种十分消极的态度,当你对你正在做的事情,抱着一种不以为然的态度,甚至对你所做的事情产生怀疑的时候,你就会找到各种理由来支撑你的不自信,怀疑、不自信。

信心的大小往往决定了成就的大小,庸庸碌碌的人们,自认为自己做不了什么事情,所以他们自己仅仅能获得很少的报酬,他们不相信自己能够做出了不起的事情,那么抱着这种心态,他们可能就真的不行了。

他们通常认为自己并不是那么重要,自己所做的每一件事情也是无足轻重的,时间长了之后,连他们的举止也会变得越来越不自信。如果他们不能正确地将自己的自信抬高,他们就会在自我认知的时候变得愈发的畏缩,越来越渺小。而他们看待自己的态度,也会影响别人看他们的态度,于是这些人在别人的目光中就会变得更加的渺小。

那些不断积极向前的人,是肯定自己有很大价值的人,这些人通常能够获得很高的报酬,他相信自己能够处理艰巨的事情,而最后的结果往往证明了他们真的能够做到。

当我和别人竞争的时候,我想到的是我跟他们是一样成功的,而不是我根本无法和他们相提并论。当机会出现的时候,我想到的是我一定能做到,而不是我做不到。

我时常提醒自己:你比你自己想象的要好得多。

每个人都是自己思想的产物,想的是一个很小的目标,那么能够预见到成果也是微小的。而想到的是巨大目标的时候,最终就会取得重大的成功。

路过:补充一下,孙子兵法里说这么一句『求其上,得其中;求其中,得其下;求其下,必败。』

那些能够在自己领域获得成就的人,都是因为能够脚踏实地奉行自我发展和成长计划的人,这项计划训练能够给他们带来一系列的报酬,能够获得家人尊重的报酬,获得同事与朋友赞美的报酬,实现自我价值的报酬,成为重要人物的报酬,收入增加、生活水准提高的报酬。

成功到成就,就是人们生命当中的最终目标,它需要我们用积极的思考去实现,当然,在任何时候,我都要保证自己的信念不出任何问题。

1903年6月7日 (此时老约翰65岁,小约翰30岁)

写在后边:

  1. 我一直觉得自己属于不大自信的人,总感觉自己不如别人,也会把一些事情搞砸,习惯于事情开始之前就降低预期,也确实如书中所说,没做成什么事情。我也尝试分析过原因,后来有在改正。这种类似「自怜」的情绪其实没有任何现实意义,所以说对我来说,这篇深得我心。

  2. 放弃是最轻松的事情了,就好比困得不行了,床就在旁边,躺下去就能睡着,睡着就舒服了。这个时候关心你的人会心疼你,告诉你不用那么累;不关心你的人,嘴碎的可能提几句,但是也仅此而已;至于剩下的人,没人会在乎你的。人生终究是一个人的路哇。

  3. 考虑到年纪大了以后记性也差了,上边洋洋洒洒写一大堆,最后记得住的可能没几个,为了稍微弥补一下这种缺陷,摘出来其中一句「而他们看待自己的态度,也会影响别人看他们的态度。」(别指望着哪位伯乐发现你这位千里马了,千里马至少得有千里马的样子,把头埋在土里像什么样子…)

2020年5月23日 下午9:21 @SZ

直播,读书与我

发表于 2020-05-16
字数统计: 1.3k 字 | 阅读时长 ≈ 4 分钟

中午抽时间看了李彦宏的直播视频,有一个点感受很深:直播过程中总是提及成长过程中书籍可能的影响作用,就会问到什么时候看了什么书。

我想了下自己的,似乎和其他事情一样贫瘠:小学初中时候受同龄人影响,看得最多的是玄幻小说,第一本书叫《飘邈之旅》,我的眼睛近视和这时候的看书习惯有关系。印象最深的场景是在学校爬在被窝里用那时候笔上带的灯偷偷地看,其实那个灯光很微弱,但是因为觉得很有趣,就会去看,即使放假在家也会连着轴看,不吃不喝废寝忘食。这本书加前前后后加起来大概看了 2-3 三遍。后来发现,这本书质量还算好的,其他的网文小说质量良莠不齐,随着年龄增加便逐渐放弃了。但是这些书,我觉得多多少少还是对早年的我造成了些影响,具体是哪些倒也说不上来。

名著也是看过的,比如《格列佛游记》《鲁宾逊漂流记》《钢铁是怎样炼成的》之类的,但是到现在几乎没什么印象了,我反而觉得这些书影响不如上边的那些书高。

高中时候应该没时间看书,对看书似乎也没兴趣,现在也不记得了。

所以,早年的我阅读量用贫瘠这个词形容应该是恰当的。

大学以后,看书倒是稍微多了,但是那个时候也只是觉得自己应该去看书,而不是自己主动想看书,看过的书印象中应该分为三大类:传记类,文学类,历史类,但是你要我具体说上来看了什么书,现在也大多不记得了。传记类应该看过乔布斯的,周恩来,褚时健;文学类貌似日本的书多一些;历史类如大秦帝国,明朝那些事儿。当时候也只是当做爱好来看待,更没有做笔记的习惯(只是被动接受,而非主动思考),我貌似记得也不多了。所以我特别佩服那种看了书就滔滔不绝总结和讲出来的,我似乎更习惯去感受,而非表达出来。

真正阅读量起来的,应该是我来深圳以后(因为自己一个人的时间变多了),是近几年的事情,特别是有了微信读书(18 年的时候),很方便看书而且也有统计阅读时长,并且秉持着更加「实用」的目的去看书,比如看了《穷查理宝典》才发现,优秀的人大多有读书的习惯,并且从中汲取智慧;看了《如何阅读一本书》知道了原来阅读还有阅读的方法;看了《毛泽东传》才知道需要好好做笔记,并且有了现在的每周一次的读书笔记;诸如此类。

所以我大概在近几年的时候才开始真正地接触阅读,知道自己喜欢和享受,主动去做阅读这件事情,并且希望自己能从中获益(真是迟钝… 我们总是老得太快,而又成长得太慢)。另外,就感性而言,很多时间都是书本陪我渡过的,我很感激这些文字的存在,我想这是任何其他人都无法提供的。

我发现,看过的书会忘掉,即使自己好好做笔记的想法也会忘掉,只有极少部分才会沉淀下来,看得多忘得多,那看书的意义何在,早几年前看到过一句话,我刚又去搜了下,如下:

『当我还是个孩子时,我吃过很多食物,现在已经记不起来吃过什么了。但是可以肯定的是,它们中的一部分已经长成我的骨头和肉。』

嗯,我很赞同。虽然没办法说上具体的,比如什么书的什么观点对我造成了何种影响,但是我觉得现在的我,如一些行为处事,想法看法等,和读过的书有莫大的关系。

本来是打算写读书笔记的,结果发现写自己的阅读经历已经足够长了,考虑到篇幅和时间原因,就延后吧。最后以我最喜欢的一本书《穷查理宝典》里芒格的一句话作为结尾吧:『我这辈子遇到的聪明人(来自各行各业的聪明人)没有不每天阅读的——没有,一个都没有。沃伦读书之多,我读书之多,可能会让你感到吃惊。我的孩子们都笑话我。他们觉得我是一本长了两条腿的书。』

以上,共勉。

2020年5月16日 下午5:45 @SZ

第八封 只有放弃才会失败

发表于 2020-05-10
字数统计: 1.4k 字 | 阅读时长 ≈ 4 分钟

开头:今天是只有一天的周末。

在我的心目当中,林肯是不会被困难击倒、不屈不挠的代名词。
他幼年什么都没有,甚至曾经被赶出家园。
他第一次经商就以失败告终,第二次经商的经历则更加的悲惨,以至于在随后的十几年时间里他一直在偿还着自己的债务。
同样,他的从政之路一样坎坷,第一次竞选议员他就失败了,并且因此丢掉了工作。可是幸运的是,第二次竞选他成功了,但是随后丧失亲人的痛苦以及竞选州议员发言人的失败却给了他极大的打击,但是他并没有灰心,随后的竞选当中,他经历了六次失败,但是每次失败之后他仍然没有放弃,这种经历直到他当选美国总统为止。

路过:总结一下,经商两次失败告终;十几年一直在偿还债务;竞选失败了八次。我觉得看书的一个意义在于告诉自己不要把自己的痛苦放大,从而自怨自艾,告诉自己你没什么特别的,然后平常心走下去。找机会读一下林肯的传记。

每次在竞选失败之后,林肯都会不停地激励自己:“这只不过是滑了一跤而已,并不是死了,只要爬起来就行了。”这些词汇就是林肯克服困难的力量源泉,同时也是林肯能够享誉盛名的利器。

林肯的一生当中,书写出了一个伟大的真理:除非你自己放弃,不然没有人能够打垮你。

路过:词汇或者是语录挺重要的,可以把它当成一个微环境,虽然看不见摸不着,就像我现在整理这本书,我也在吸收一些东西。

有太多的人高估了自己所欠缺的东西,却又低估了自己所拥有的,以至于最后丧失了成为胜利者的机会,这显然是个悲剧。

路过:怎么解决这个问题呢,别太自信,但是也别太自卑,理性看待自己。

没有不经历失败的幸运者,最重要的是,不要因为失败而使自己成为懦夫。如果我们尽了自己最大的努力仍然失败了,我们所应该做的就是要吸取教训,让自己在接下来的日子里努力变得更好。

路过:所以,凡是尽力就好,对得起自己就行。记录一下看曾国藩传看到的话:「吾辈自尽之道,则与运气血战一搏,赌乾坤于俄顷,校殿最于锱铢。」「把运气交给上天,把努力留给自己。」

我痛恨生意失败、失去金钱,但是真正让我关心的是,我害怕在我以后的生意当中,因为太过于谨慎而变成一个懦夫,如果真的是这样的话,那我的损失就更大了。

路过:上一封信《最可怕的精神破产》里说:「人始终都是要保持活力的,要永远坚强,不管是遇到了什么样的失败和挫折,这是我唯一能做到的事情。」

他(林肯)有一句话说得很好:“你没有办法在天鹅绒上磨利剃刀。”

路过:类似的,你躺在床上肯定没办法好好学习或者锻炼身体,环境太安逸不行,挑合适的环境做适合的事情。

世界上没有任何一样东西能够取代毅力,就连才干都不可以。怀才不遇的人比比皆是,最终一事无成的天才也非常普遍。教育也不行,这个世界上充斥了太多学而无用的人,只有毅力和决心才能让人不断向前。

路过:附议,在第四封信《现在就去做》里有这么一句:「即便是非常普通的计划,但是如果能够得到很好的执行并且发展,都会远远比半途而废的计划要好得多。」

当我们向高峰不断迈进的时候,我们必须要牢记:每一级阶梯都能让我们踩足够的时间,然后再去踏上更高的一级,它并不是给我们用来休息的。

每个人都有无限的可能,除非我们能够找出这种可能在哪里,并且坚持去用它,否则这种可能毫无意义。

伟大的机会不假外求,这需要我们通过努力工作来掌握它。

即便我们做了,最终没有获得成功,对我们自己来说,我们仍然是个赢家,因为在这个过程当中,我们已经拥有了知识,同时也学会了如何去面对人生,这本身就是最大的成功。

路过:今敏的《千年女优》有类似的说法,一直追逐的目标在不在已经不重要了,重要的是追逐过程中的自己。

1909年2月12日 (此时老约翰71岁,小约翰36岁)

最后:祝妈妈们母亲节快乐 ヾ(●゜▽゜●)♡

2020年5月10日 下午1:02 @SZ
路过: 竟然差了一个世纪之多(111年..),文字和书籍真是神奇的东西.. 还有什么理由不好好每天进步一点点呢?

竞争,抵押与精神破产

发表于 2020-05-02
字数统计: 2.3k 字 | 阅读时长 ≈ 7 分钟

这次记录三封信,因为前两封的点不多。

第五封 要有竞争的决心

约翰,每一场至关重要的战争都能够决定自己的命运,“后退就代表着投降,后退也就意味着成为奴隶”,战争既然不能避免,那我们就勇敢地去接受。在这个世界上,竞争一刻都不会停止,我们永远没有休息的时候。我们需要做的就是,带上自己钢铁般的决心,面对迎面而来的各种挑战和竞争,并且要情绪高昂地在其中享受,否则结果一定不尽如人意。

(此时老约翰63岁,小约翰28岁)

第六封 为前途抵押

常常有人说,冒险的人经常失败,但是白痴不也是这样么?

我们认识的或者熟知的那些富翁之中,只依靠自己积累,最后挣钱发达的人可以说是少之又少,更多的人是依靠借钱而发财的,这其中的道理其实很简单,一块钱的生意显然比不上一百块钱的生意赚钱得多。

路过:确实是个道理,但是也得看情况。前文有补充:

「在我创业的初期,甚至在我小有成就的时候,都一直在统治着我,以至于每次在借钱的时候,我都会在谨慎和冒险之间不停地徘徊,苦苦地挣扎,甚至夜不能眠,躺在床上的时候就开始不自主地计算如何偿还欠款。」

「借钱并不是什么坏事,它并不会让你破产,只要你不将它看成自己的救生圈,只在危机的时候使用,而是将其当作一种工具,你就能够利用它来创造机会。不然,你就会掉入恐惧失败的泥潭当中,让这种恐惧束缚住你本应该大展宏图的双臂,最终导致一事无成。」

应该是胜率比较大的时候借钱比较稳妥。

联想到了《戴维斯王朝》的一点片段:

用现金买了房的戴维斯,很快用借来的钱(融资)买了股票 … 尽管大家可能没有意识到这一点,但买房按揭所使用的杠杆,却是长期给他们带来最大收益的主要原因。戴维斯认为将财务杠杆运用到股票上,会有比房屋按揭更大的收益潜力,他对此极具信心。所以,他选择融资买股而非按揭买房。』

戴维斯从来没有借钱消费的行为。对他而言,如果借钱购买一辆新车或冰箱,简直是对金钱的侮辱。但他热衷于通过借钱去赚更多的钱。

第二次路过:太过冒险,可能老本跌穿;太过保守,可能一事无成;以及借钱消费这件事情的启发:并不是很多人和你做一样的事情就能证明你是对的,反而有可能你们全部都错了,这个叫什么好呢,叫「社会认同心理倾向」。

不管是想要赢得财富,还是要赢得人生,优秀的人在竞技场,首先想到的不是我输了会怎么样,而是我胜利之后想要做些什么。

路过:出于风险控制的考虑,很难不考虑如果失败了的情况。知道了选择去做和不知道选择去做是两件事情。这样导致的一个结果是:”You can not tell the quality of a decision from the outcome.” 这里应该是说还是要对自己做的事情有信心,心态决定一切。

儿子,人生就是一个不断抵押的过程,为了前途,我们抵押自己的青春,为了幸福,我们抵押上生命。因为如果你不敢逼近自己的底线,那么你终将会输掉,为了成功,我们抵押冒险,难道不值得么?

儿子,诚实是一种方法,更是一种策略,因为我支付了诚实,所以我赢得了银行家甚至是更多人的信任,也正是因为它,我度过了一道道的难关,踏上了成长壮大的道路。

路过:想拥有一项好品德或者好习惯,不是因为在道德层面觉得它「好」或者「高尚」,而且觉得拥有了以后自己会获益,这样就会很好坚持下去。

(此时老约翰61岁,小约翰26岁)

第七封 最可怕的精神破产

要快乐起来,我的儿子,你要知道的是,在这个世界当中,太多人的一生都不会一帆风顺,相反,失败才是永恒的主题,也许正是因为这个世界上充斥着太多的失败,追求卓越,追求成功才看起来那样的迷人,让人们前仆后继地去追逐,甚至不惜以生命作为代价,可是即便是这样,失败依然常常陪伴在我们的左右。

我们的命运就是这样,只是与其他人不同的是,我将失败当成了烈酒,咽进去的是苦涩,可是吐出来的却是精神。

路过:说得多好… 忽然联想到人和人的关系,很多人都受过伤,甚至因此怀疑自己。正因为这个世界有这么多的不完美,让人伤心的地方,所以我们都在试图寻找一些美好的东西。

天下没有白吃的午餐,更不可能永远都维持着现状,如果你止步不前的话,那么你就是在倒退,但是想要前进的话,就一定要勇于冒险并做出决定。

路过:逆水行舟,不进则退,不只是学习。

人人都讨厌失败,但是一旦失败成了你逃避做事的动机,那么你就会走上失败的道路,这是非常可怕的事情,甚至是一场灾难,因为这预示着你可能会丧失掉原本应该有的机会。

路过:文艺版的说法:「你不愿意种花,你说,我不愿看见它一点点凋落。是的,为了避免结束,你避免了一切开始。 — 顾城」 而且没给出解决方案,甚至会让人觉得,这样还不错… 问题是既然你真得在意花儿,想让花儿长得又好又开心,为什么不把机会攥在自己手里,扪心自问,交给别人你放心吗?

你看看那些穷人(不存在歧视)你就会知道,他们并不愚蠢,他们也并不是不努力,他们只是缺少一个机会。你要知道的是,我们生活在一个弱肉强食的世界当中,在这里你不想被别人吃掉,就要选择耻辱,逃避风险就几乎等于破产,而你利用了机会,就是剥夺了别人的机会,保证了自己。

路过:每次我早上或者晚上走在路上,看到路边工作的人,比如小商贩,清洁工,就会觉得这个世界好不公平,明明这些人也勤劳,聪明,善良,却得没日没夜的干活,而且报酬可能异常得少,只是因为生存环境导致的。类似的有欠发达地区的小孩子,或者原始部落的人们,就只是生长的环境不一样,人生命运却大不相同,这就是巴菲特说的「卵巢彩票」。 「职业无高低贵贱之分」也是分情况,从尊重他人的出发点来说,这是没错的。

我的座右铭是:人始终都是要保持活力的,要永远坚强,不管是遇到了什么样的失败和挫折,这是我唯一能做到的事情。我们能够理解的是,我们干什么才能让自己感到快乐,什么东西值得你为之付出生命。最初的理想,就像是清洁工手中的扫把那样,将扫尽你成功道路上所有的阻碍。儿子,你要知道你自己的期望在哪里,只要你不丢掉它,成功一定会到来。

路过:忽然想到了小学课本提到的座右铭『早』…

儿子,请记住我一直深信不疑的成功公式:
梦想+失败+挑战=成功之道。

儿子,你如果宣布精神破产的话,那么最终你就会输掉一切,你需要知道的是,人的事业就像是浪潮一样,如果你踩在浪头之上,功名利禄随之而来,而一旦你错失掉机会,那么你的一生都会被困在浅滩当中挣扎。

失败是一种学习的经历,你可以把它当成自己的墓碑,同样也可以将它当成成功的绊脚石。

(此时老约翰61岁,小约翰26岁)

结束语:感觉是满满的鸡汤。

2020年5月2日 下午12:16 @SZ

1…456…9

Nonewood

90 日志
3 分类
59 标签
© 2024 Nonewood | Site words total count: 144.4k
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4