kindle manager
This commit is contained in:
18
changelog.md
18
changelog.md
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
## 1.0.1 (20200528)
|
## 1.0.1 (20200528)
|
||||||
### feature
|
### feature
|
||||||
- add search clip
|
- add search clip and some functions
|
||||||
|
|
||||||
## learn lesson
|
## learn lesson
|
||||||
- assign value to a not exist key, will throw KeyError, too inflexible!!! perl much better
|
- assign value to a not exist key, will throw KeyError, too inflexible!!! perl much better
|
||||||
@@ -33,6 +33,21 @@ b['1']['2'] = {'3':1} # OK
|
|||||||
suff = {'MD':'.md','CSV':'.csv','JSON':'.json'}
|
suff = {'MD':'.md','CSV':'.csv','JSON':'.json'}
|
||||||
198 op = OUTPREF+suff[ft]
|
198 op = OUTPREF+suff[ft]
|
||||||
```
|
```
|
||||||
|
- assign value style is pithiness
|
||||||
|
```
|
||||||
|
(authinfo, dateinfo, content) = (s[0], s[1], s[2] if len(s)==3 else None)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 1.0.1 (20200530)
|
||||||
|
### feature
|
||||||
|
- remove duplication
|
||||||
|
- refactor some code
|
||||||
|
|
||||||
|
## learn lesson
|
||||||
|
- change dict keys between iteration, will throw RuntimeError:
|
||||||
|
dictionary changed size during iteration
|
||||||
|
- reference - http://www.cocoachina.com/articles/89748
|
||||||
|
|
||||||
|
|
||||||
# feature plan
|
# feature plan
|
||||||
## 20200528
|
## 20200528
|
||||||
@@ -40,3 +55,4 @@ b['1']['2'] = {'3':1} # OK
|
|||||||
- first abstract from kindle hard / local directory for different OS
|
- first abstract from kindle hard / local directory for different OS
|
||||||
- add GUI use QT
|
- add GUI use QT
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
208
kman.py
208
kman.py
@@ -2,7 +2,7 @@
|
|||||||
#########################################################
|
#########################################################
|
||||||
## @file : kman.py
|
## @file : kman.py
|
||||||
## @desc : kindle note managerment tool
|
## @desc : kindle note managerment tool
|
||||||
## @create : 20200526
|
## @create : 2020/05/26
|
||||||
## @author : Chengan
|
## @author : Chengan
|
||||||
## @email : douboer@gmail.com
|
## @email : douboer@gmail.com
|
||||||
#########################################################
|
#########################################################
|
||||||
@@ -63,6 +63,7 @@ CLIPPATH = './My Clippings.txt' # /Volumes/Kindle/documents/My\ Clippings.txt
|
|||||||
OUTPREF = './clip'
|
OUTPREF = './clip'
|
||||||
DEBUG = 1 # 0 - INFO; 1 - DEBUG
|
DEBUG = 1 # 0 - INFO; 1 - DEBUG
|
||||||
LOG2FILE = 1 # 0 - to stdio; 1 - to file
|
LOG2FILE = 1 # 0 - to stdio; 1 - to file
|
||||||
|
DELIMITER= '|'
|
||||||
|
|
||||||
# log info
|
# log info
|
||||||
logger = logging.getLogger()
|
logger = logging.getLogger()
|
||||||
@@ -125,8 +126,6 @@ def parse_section(s,i):
|
|||||||
'time':'10:26:31'
|
'time':'10:26:31'
|
||||||
'content':content }}}
|
'content':content }}}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
# 1. highlight over the picture, the content(#3 line) is empty, only two lines
|
# 1. highlight over the picture, the content(#3 line) is empty, only two lines
|
||||||
# 2. bookmark section only two lines
|
# 2. bookmark section only two lines
|
||||||
# 3. other not correct format < 2
|
# 3. other not correct format < 2
|
||||||
@@ -135,9 +134,13 @@ def parse_section(s,i):
|
|||||||
|
|
||||||
# parse #2 line
|
# parse #2 line
|
||||||
section = defaultdict(dict)
|
section = defaultdict(dict)
|
||||||
|
"""
|
||||||
authinfo = sec[0]
|
authinfo = sec[0]
|
||||||
dateinfo = sec[1]
|
dateinfo = sec[1]
|
||||||
content = sec[2] if len(sec)==3 else None
|
content = sec[2] if len(sec)==3 else None
|
||||||
|
"""
|
||||||
|
(authinfo, dateinfo, content) = \
|
||||||
|
(s[0], s[1], s[2] if len(s)==3 else None)
|
||||||
|
|
||||||
das = da.search(dateinfo)
|
das = da.search(dateinfo)
|
||||||
# type of section
|
# type of section
|
||||||
@@ -150,11 +153,14 @@ def parse_section(s,i):
|
|||||||
'''
|
'''
|
||||||
tpy = ('HL' if das.group(2)=='标注' else \
|
tpy = ('HL' if das.group(2)=='标注' else \
|
||||||
('NT' if das.group(2)=='笔记' else 'BM'))
|
('NT' if das.group(2)=='笔记' else 'BM'))
|
||||||
|
"""
|
||||||
pos = das.group(1)
|
pos = das.group(1)
|
||||||
day = das.group(3)
|
day = das.group(3)
|
||||||
week = das.group(4)
|
week = das.group(4)
|
||||||
pmam = das.group(5)
|
pmam = das.group(5)
|
||||||
time = das.group(6)
|
time = das.group(6)
|
||||||
|
"""
|
||||||
|
(pos, x, day, week, pmam, time) = das.groups()[0:6]
|
||||||
|
|
||||||
# parse #1 line
|
# parse #1 line
|
||||||
aus = au.search(authinfo)
|
aus = au.search(authinfo)
|
||||||
@@ -174,9 +180,52 @@ def parse_section(s,i):
|
|||||||
|
|
||||||
return section
|
return section
|
||||||
|
|
||||||
def format_out(bks, ft='MD'):
|
def format_time(ds):
|
||||||
|
""" format date
|
||||||
|
Args:
|
||||||
|
ds: 2020年1月13日 星期一 上午 8:11:05
|
||||||
|
Return:
|
||||||
|
2020/1/13 20:11:05
|
||||||
|
"""
|
||||||
|
d = ds.split(' ')
|
||||||
|
res = re.search(r'(\d{4}).(\d{1,2}).(\d{1,2})',d[0])
|
||||||
|
ymd = '/'.join(res.groups())
|
||||||
|
res = re.search(r'(\d{1,2})(:\d{1,2}:\d{1,2})',d[3])
|
||||||
|
tm = ' '+str(int(res.group(1)) + (0 if d[2]=='上午' else 12))+res.group(2)
|
||||||
|
|
||||||
|
return ymd+tm
|
||||||
|
|
||||||
|
def format_data(bks, ft='MD'):
|
||||||
|
""" format data for MD & CSV
|
||||||
|
|
||||||
|
Args:
|
||||||
|
bks: books dict
|
||||||
|
f: can be 'MD'/'CSV'
|
||||||
|
|
||||||
|
Return:
|
||||||
|
list [header, sections]
|
||||||
|
header and sections are lists
|
||||||
|
"""
|
||||||
|
hd =[] # header
|
||||||
|
secs =[] # content
|
||||||
|
DELIMITER = '|' if ft=='MD' else ','
|
||||||
|
|
||||||
|
hd.append(DELIMITER.join(['TYPE','BOOKNAME','AUTHOR','MARKTIME','CONTENT']))
|
||||||
|
if ft=='MD':
|
||||||
|
hd.append(DELIMITER.join(['--' for i in range(5)]))
|
||||||
|
|
||||||
|
for kb,vb in bks.items():
|
||||||
|
author = vb['author']
|
||||||
|
for ks, vs in vb.items():
|
||||||
|
if ks in ['author', 'lines']: continue
|
||||||
|
secs.append(DELIMITER.join([vs['type'],kb,author, \
|
||||||
|
format_time(' '.join([vs['day'],vs['week'],vs['meridiem'],vs['time']])),vs['content']]))
|
||||||
|
|
||||||
|
return hd+secs
|
||||||
|
|
||||||
|
def format_out(bks, fnpref, ft='MD'):
|
||||||
"""format output and write to file
|
"""format output and write to file
|
||||||
MARKDOWN format:
|
markdown format:
|
||||||
TYPE | bookname | author | marktime | content
|
TYPE | bookname | author | marktime | content
|
||||||
--|--|--|--|--
|
--|--|--|--|--
|
||||||
xx|xx|xx|xx|xx
|
xx|xx|xx|xx|xx
|
||||||
@@ -195,15 +244,107 @@ def format_out(bks, ft='MD'):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
suff = {'MD':'.md','CSV':'.csv','JSON':'.json'}
|
suff = {'MD':'.md','CSV':'.csv','JSON':'.json'}
|
||||||
op = OUTPREF+suff[ft]
|
op = fnpref+suff[ft]
|
||||||
|
|
||||||
with open(op, 'w', encoding='gbk', errors='ignore') as fw:
|
with open(op, 'w', encoding='utf8', errors='ignore') as fw:
|
||||||
if ft=='JSON':
|
if ft=='JSON':
|
||||||
ft.write(json.dumps(bks, indent=4, sort_keys=True, ensure_ascii=False))
|
fw.write(json.dumps(bks, indent=4, sort_keys=True, ensure_ascii=False))
|
||||||
elif ft=='MD':
|
elif ft in ['MD','CSV']:
|
||||||
pass
|
for s in format_data(bks, ft):
|
||||||
|
fw.write(s)
|
||||||
|
fw.write('\n')
|
||||||
else:
|
else:
|
||||||
ft.write(json.dumps(bks)) # only for load back
|
fw.write(json.dumps(bks)) # only for load back
|
||||||
|
|
||||||
|
def drop_duplicate(bks):
|
||||||
|
""" drop duplicated section
|
||||||
|
|
||||||
|
If I mark second time in same place, kindle will create two note,
|
||||||
|
so I need to remove the duplication record
|
||||||
|
|
||||||
|
Args:
|
||||||
|
bks: books dict
|
||||||
|
Return:
|
||||||
|
books remove duplicate sections
|
||||||
|
"""
|
||||||
|
[preks,prevs] = ['',{'content':'!#$%^&$%','type':'xx'}]
|
||||||
|
for kb,vb in bks.items():
|
||||||
|
bks[kb]['lines'] = 0
|
||||||
|
# add copy() or throw RuntimeError: dictionary changed size during iteration
|
||||||
|
# reference - http://www.cocoachina.com/articles/89748
|
||||||
|
for ks, vs in vb.copy().items():
|
||||||
|
if ks in ['author', 'lines']: continue
|
||||||
|
bks[kb]['lines'] += 1
|
||||||
|
if (vs['content'] in prevs['content'] or \
|
||||||
|
prevs['content'] in vs['content']) and \
|
||||||
|
prevs['type'] == vs['type']:
|
||||||
|
bks[kb].pop(preks)
|
||||||
|
if vs['content'] != prevs['content']:
|
||||||
|
print('prevs',prevs['type'],prevs['content'])
|
||||||
|
print(' vs', vs['type'], vs['content'])
|
||||||
|
|
||||||
|
preks = ks
|
||||||
|
prevs = vs
|
||||||
|
|
||||||
|
return bks
|
||||||
|
|
||||||
|
def add_note_to_highlight(bks):
|
||||||
|
""" append note content to corresponding highlight
|
||||||
|
and remove NT sections
|
||||||
|
|
||||||
|
Args:
|
||||||
|
bks: books dict
|
||||||
|
Return:
|
||||||
|
changed books
|
||||||
|
"""
|
||||||
|
[preks,prevs] = ['',{'content':'!#$%^&$%','type':'xx'}]
|
||||||
|
for kb,vb in bks.items():
|
||||||
|
for ks,vs in vb.copy().items():
|
||||||
|
if ks in ['author', 'lines']: continue
|
||||||
|
if [prevs['type'], vs['type']] == ['HL','NT']:
|
||||||
|
bks[kb][preks]['content'] += str(NTPREF+vs['content'])
|
||||||
|
bks[kb].pop(ks)
|
||||||
|
|
||||||
|
preks = ks
|
||||||
|
prevs = vs
|
||||||
|
|
||||||
|
return bks
|
||||||
|
|
||||||
|
def search_clip(bks, s, t='ALL', p='ALL'):
|
||||||
|
"""search clip, searching scope may be title/author/content
|
||||||
|
Args:
|
||||||
|
input: bks: books dict
|
||||||
|
s: key word
|
||||||
|
t: 'ALL'
|
||||||
|
'HL'
|
||||||
|
'BM'
|
||||||
|
'NT'
|
||||||
|
p: 'ALL'
|
||||||
|
'TITLE'
|
||||||
|
'AUTHOR'
|
||||||
|
'CONTENT'
|
||||||
|
Return: search clipping content
|
||||||
|
"""
|
||||||
|
nbks = defaultdict(dict)
|
||||||
|
nu = 0
|
||||||
|
for kb,vb in bks.items():
|
||||||
|
nbks[kb]['lines'] = 0
|
||||||
|
for ks,vs in vb.copy().items():
|
||||||
|
if ks in ['author', 'lines']:
|
||||||
|
nbks[kb][ks] = vs
|
||||||
|
continue
|
||||||
|
if t in ['ALL', vs['type']]:
|
||||||
|
scopestr = {'ALL':''.join([kb,vb['author'],vs['content']]), \
|
||||||
|
'TITLE':kb, 'AUTHOR':vb['author'], 'CONTENT':vs['content']}
|
||||||
|
found = re.search(s, scopestr[p])
|
||||||
|
if found:
|
||||||
|
nbks[kb][ks] = vs
|
||||||
|
nbks[kb]['lines'] += 1
|
||||||
|
nu += 1
|
||||||
|
if nbks[kb]['lines']==0:
|
||||||
|
nbks.pop(kb)
|
||||||
|
|
||||||
|
return [nu,nbks]
|
||||||
|
|
||||||
def statistic(bks):
|
def statistic(bks):
|
||||||
pass
|
pass
|
||||||
@@ -226,26 +367,11 @@ def json2dict(jf):
|
|||||||
d=json.load(f)
|
d=json.load(f)
|
||||||
return d
|
return d
|
||||||
|
|
||||||
def search_clip(bks, s, t='ALL', p='ALL'):
|
|
||||||
"""search clip, searching scope may be title/author/content
|
|
||||||
Args:
|
|
||||||
input: bks: books dict
|
|
||||||
s: key word
|
|
||||||
t: 'ALL'
|
|
||||||
'HL'
|
|
||||||
'BM'
|
|
||||||
'NT'
|
|
||||||
p: 'ALL'
|
|
||||||
'TITLE'
|
|
||||||
'AUTHOR'
|
|
||||||
'CONTENT'
|
|
||||||
Return: search clipping content
|
|
||||||
"""
|
|
||||||
pass
|
|
||||||
|
|
||||||
if __name__=='__main__':
|
if __name__=='__main__':
|
||||||
# 4 lines for each section seperated with '======='
|
# 4 lines for each section seperated with '======='
|
||||||
# so read 4 lines before '======='
|
# so read 4 lines before '======='
|
||||||
|
|
||||||
|
# loop to fill books dict
|
||||||
with open(CLIPPATH, 'r', encoding='utf8', errors='ignore') as f:
|
with open(CLIPPATH, 'r', encoding='utf8', errors='ignore') as f:
|
||||||
books = defaultdict(dict)
|
books = defaultdict(dict)
|
||||||
secd = defaultdict(dict)
|
secd = defaultdict(dict)
|
||||||
@@ -261,10 +387,10 @@ if __name__=='__main__':
|
|||||||
# content more than 1 line
|
# content more than 1 line
|
||||||
if idx>3:
|
if idx>3:
|
||||||
sec[2] += str(' '+line)
|
sec[2] += str(' '+line)
|
||||||
logger.debug('idx {} {}'.format(idx, sec[2]))
|
#logger.debug('idx {} {}'.format(idx, sec[2]))
|
||||||
else:
|
else:
|
||||||
sec.append(line)
|
sec.append(line)
|
||||||
logger.debug('idx {} {}'.format(idx, sec[idx-1]))
|
#logger.debug('idx {} {}'.format(idx, sec[idx-1]))
|
||||||
else:
|
else:
|
||||||
idx = 0
|
idx = 0
|
||||||
sidx += 1
|
sidx += 1
|
||||||
@@ -279,19 +405,41 @@ if __name__=='__main__':
|
|||||||
books[bn]['author'] = secd[bn]['author']
|
books[bn]['author'] = secd[bn]['author']
|
||||||
books[bn][str(sidx)] = secd[bn][str(sidx)]
|
books[bn][str(sidx)] = secd[bn][str(sidx)]
|
||||||
|
|
||||||
|
# not add note to highlight content here,
|
||||||
|
# because NT maybe duplicated, we need remove duplication record before
|
||||||
|
"""
|
||||||
if tpy=='NT' and books[bn][str(sidx-1)]['type']=='HL':
|
if tpy=='NT' and books[bn][str(sidx-1)]['type']=='HL':
|
||||||
books[bn][str(sidx-1)]['content'] += str(NTPREF+sec[2])
|
books[bn][str(sidx-1)]['content'] += str(NTPREF+sec[2])
|
||||||
|
"""
|
||||||
|
|
||||||
else: # BM or not correct format section
|
else: # BM or not correct format section
|
||||||
sidx -= 1
|
sidx -= 1
|
||||||
|
|
||||||
# initial section for next section loop
|
# initial section for next section loop
|
||||||
sec = []
|
sec = []
|
||||||
|
|
||||||
|
# remove duplication
|
||||||
|
drop_duplicate(books)
|
||||||
|
|
||||||
|
# test search note function
|
||||||
|
searchnote = search_clip(books, '三大都市圈', 'ALL', 'CONTENT')
|
||||||
|
if searchnote[0] > 0: format_out(searchnote[1], 'searchcontent', ft='MD')
|
||||||
|
searchnote = search_clip(books, '经济', 'ALL', 'TITLE')
|
||||||
|
if searchnote[0] > 0: format_out(searchnote[1], 'searchtitle', ft='MD')
|
||||||
|
searchnote = search_clip(books, '巴曙松', 'ALL', 'AUTHOR')
|
||||||
|
if searchnote[0] > 0: format_out(searchnote[1], 'searchauthor', ft='MD')
|
||||||
|
|
||||||
|
# add note content to hightlight, then delete note
|
||||||
|
add_note_to_highlight(books)
|
||||||
|
|
||||||
# test dict json convert
|
# test dict json convert
|
||||||
with open('./xx', 'w', encoding='utf8', errors='ignore') as fw:
|
with open('./xx', 'w', encoding='utf8', errors='ignore') as fw:
|
||||||
fw.write(dict2json(books))
|
fw.write(dict2json(books))
|
||||||
if json2dict('./xx')==books: print( 'test OK')
|
if json2dict('./xx')==books: print( 'test OK')
|
||||||
|
|
||||||
|
format_out(books, OUTPREF, ft='MD')
|
||||||
|
|
||||||
# print data with json format
|
# print data with json format
|
||||||
logger.debug(json.dumps(books, indent=4, sort_keys=True, ensure_ascii=False))
|
logger.debug(json.dumps(books, indent=4, sort_keys=True, ensure_ascii=False))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
397
tclip.txt
397
tclip.txt
@@ -1,9 +1,4 @@
|
|||||||
庆余年(精校版) (猫腻)
|
另一半中国史 (高洪雷)
|
||||||
|
|
||||||
- 您在位置 #33260 的书签 | 添加于 2020年1月12日星期日 下午10:37:10
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- 您在位置 #2468 的书签 | 添加于 2020年1月12日星期日 下午11:09:06
|
- 您在位置 #2468 的书签 | 添加于 2020年1月12日星期日 下午11:09:06
|
||||||
|
|
||||||
@@ -13,393 +8,3 @@
|
|||||||
|
|
||||||
==========
|
==========
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
薛兆丰经济学讲义 (薛兆丰)
|
|
||||||
|
|
||||||
- 您在位置 #1408-1410的标注 | 添加于 2020年1月13日星期一 上午8:11:05
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
么到底什么叫边际?边际就是“新增”带来的“新增”。 例如,边际成本就是每新增一个单位产品所需要付出的新增成本;边际收入是每多卖一个产品能够带来的新增收入;边际产量是每新增一份投入所带来的新增产量;边际效用是每消耗一个单位的商品所能带来的新增享受。
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
薛兆丰经济学讲义 (薛兆丰)
|
|
||||||
|
|
||||||
- 您在位置 #1419-1421的标注 | 添加于 2020年1月13日星期一 上午8:12:44
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
这就是边际效用递减的规律,它指的是每多消耗一个单位的商品,所能带来的新增的享受在递减。例如我们吃东西的时候,食物带给我们的边际效用,通常都是递减的。 边际效
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
薛兆丰经济学讲义 (薛兆丰)
|
|
||||||
|
|
||||||
- 您在位置 #1419-1420的标注 | 添加于 2020年1月13日星期一 上午8:12:49
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
这就是边际效用递减的规律,它指的是每多消耗一个单位的商品,所能带来的新增的享受在递减。例如我们吃东西的时候,食物带给我们的边际效用,通常都是递减的。
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
庆余年(精校版) (猫腻)
|
|
||||||
|
|
||||||
- 您在位置 #43335-43336的标注 | 添加于 2020年1月17日星期五 下午6:05:22
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
“身为帝者,不可无情,不可多情。”皇帝将脸转了过去,“对身周无情者,对天下无情,天下必乱;对身周多情者,必受其害,天下丧其主,亦乱。”
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
庆余年(精校版) (猫腻)
|
|
||||||
|
|
||||||
- 您在位置 #48484-48484的标注 | 添加于 2020年1月19日星期日 下午8:00:29
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
:“园子里的护卫能掺多少人就掺多少人,我会派人盯着,
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
庆余年(精校版) (猫腻)
|
|
||||||
|
|
||||||
- 您在位置 #49901-49901的标注 | 添加于 2020年1月20日星期一 下午7:57:10
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
叶灵儿叹了口
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
庆余年(精校版) (猫腻)
|
|
||||||
|
|
||||||
- 您在位置 #63955 的书签 | 添加于 2020年1月25日星期六 下午12:15:00
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
庆余年(精校版) (猫腻)
|
|
||||||
|
|
||||||
- 您在位置 #70589-70589的标注 | 添加于 2020年1月27日星期一 下午6:32:55
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
书生造反,十年不成,
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #2971-2975的标注 | 添加于 2020年1月28日星期二 下午4:30:12
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
关于病菌的历史作用的最令人生畏的例子,来自随同哥伦布1492年的航行而开始的欧洲人对美洲的征服。虽然被那些杀人不眨眼的西班牙征服者杀死的印第安人不计其数,但凶恶的西班牙病菌杀死的印第安人却要多得多。为什么在欧洲和美洲之间这种可怕的病菌的交流是这样不对等?为什么印第安人的疾病没有大批杀死西班牙入侵者,并传回欧洲,消灭掉欧洲95%的人口?
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #2990-2992的标注 | 添加于 2020年1月28日星期二 下午4:32:56
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
可以从数学上把病菌的传播定义为:由每一个原发病人传染的新的受害者的数目。这个数目的大小取决于每一个受害者能够传染给新的受害者的持续时间的长短,以及这种病菌从一个受害者转移到下一个受害者的效率的高低。
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #2987-2988的标注 | 添加于 2020年1月28日星期二 下午4:33:12
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
病菌以各种稀奇古怪的方式使我们生病,如使我们得生殖器溃疡或腹泻。它这样做会得到什么样的演化利益呢?这似乎是特别令人费解而又自拆台脚的事,因为病菌杀死了它的宿主也就杀死了它自己。
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #2994-2995的标注 | 添加于 2020年1月28日星期二 下午4:33:47
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
我们的疾病的许多“症状”,实际上不过是某种非常聪明的病菌在改变我们的身体或行为以便使我们帮助传播病菌时所表现出来的一些方式而已。
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3018-3019的标注 | 添加于 2020年1月28日星期二 下午4:43:11
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
这就是为什么“使我们生病”是符合病菌的利益的
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3019-3019的标注 | 添加于 2020年1月28日星期二 下午4:43:17
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
但是,为什么病菌会演化出杀死宿主这种明显自拆台脚的策略呢?
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3062-3065的标注 | 添加于 2020年1月28日星期二 下午5:05:35
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
人类历史上最大的一次流行病是在第一次世界大战结束时杀死2100万人的流行性感冒。黑死病(腺鼠疫)在1346年到1352年间杀死了欧洲四分之一的人口,在有些城市里死亡人数高达70%。19世纪80年代初,当加拿大太平洋铁路修经萨斯喀彻温时,该省以前很少接触过白人及其病菌的印第安人死于肺结核的人数每年竟达到惊人的9%。
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3073-3074的标注 | 添加于 2020年1月28日星期二 下午5:08:40
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
但由于这种病菌除了在活人体内是不可能生存的,所以人死了这种病也就消失了,直到又一批后代达到易受感染的年代——直到一个受到感染的外来人使一场流行病重新开始。
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3183-3185的标注 | 添加于 2020年1月28日星期二 下午5:38:20
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
在第一年,黏液病毒在受到感染的兔子中造成了令人满意的(对澳大利亚农民来说)99.8%的死亡率。令这些农民感到失望的是,第二年兔子的死亡率下降到90%,最后下降到25%,使得要在澳大利亚完全消灭兔子的希望落空了
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3189-3191的标注 | 添加于 2020年1月28日星期二 下午5:40:07
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
一提起梅毒,我们立刻会联想到两种情况:生殖器溃疡和病情发展的十分缓慢,许多得不到治疗的患者要过好多年才会死去。然而,当梅毒于1495年首次在欧洲明确见诸记录时,它的脓疱通常从头部到膝部遍布全身,使脸上的肉一块块脱落,不消几个月就使人一命呜呼。
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3189-3193的标注 | 添加于 2020年1月28日星期二 下午5:40:17
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
一提起梅毒,我们立刻会联想到两种情况:生殖器溃疡和病情发展的十分缓慢,许多得不到治疗的患者要过好多年才会死去。然而,当梅毒于1495年首次在欧洲明确见诸记录时,它的脓疱通常从头部到膝部遍布全身,使脸上的肉一块块脱落,不消几个月就使人一命呜呼。到1546年,梅毒已演化成具有我们今天所熟悉的那些症状的疾病。显然,同多发性黏液瘤病一样,为使患者活得长些而进行演化的那些梅毒螺旋体因此就能够把它们的螺旋体后代传染给更多的患者
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3196-3197的标注 | 添加于 2020年1月28日星期二 下午5:42:57
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
1519年科尔特斯率领600个西班牙人在墨西哥海岸登陆,去征服拥有好几百万人口的勇猛好战的阿兹特克帝国
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3203-3230的标注 | 添加于 2020年1月28日星期二 下午5:43:38
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
到1618年,墨西哥原来2000万左右的人口急剧减少到160万左右。 皮萨罗于1531年率领168个人在秘鲁海岸登陆去征服有几百万人口的印加帝国时,同样带来了一场浩劫。对皮萨罗来说幸运的而对印加人来说不幸的是,天花已在1526年由陆路到达,杀死了印加的很大一部分人口,包括瓦伊纳·卡帕克皇帝和他的指定继承人。我们已在第三章中看到,皇位空缺的结果是使瓦伊纳·卡帕克的另两个儿子阿塔瓦尔帕和瓦斯卡尔卷入了一场内战,使皮萨罗在征服这个分裂的帝国中坐收渔人之利。 当我们美国人想到存在于1492年的新大陆人口最多的社会时,出现在我们心头的往往只是阿兹特克人和印加人的那些社会。我们忘记了北美洲也曾在那最合逻辑的地方——密西西比河流域养活了人口众多的印第安人社会,我们今天的一些最好的农田就在这个地方。然而,在这种情况下,西班牙征服者对于摧毁这些社会并未起到直接的作用;一切都是由事先已经传播的欧亚大陆的病菌来完成的。当埃尔南多·德索托成为第一个欧洲征服者于1540年在美国东南部行军时,他碰到了两年前因当地居民死于流行病而被放弃的一些城镇旧址。这些流行病是从沿海地区印第安人那儿传来的,而这些印第安人又是被到沿海地区来的西班牙人感染的。西班牙人的这些病菌赶在这些西班牙人之前向内陆传播。 德索托仍然看得到密西西比河下游沿岸的一些人口稠密的印第安城镇。在这次远征结束后,又过了很久,欧洲人才又一次到达密西西比河河谷,但这时欧亚大陆的病菌已在北美洲安家落户,并不断向四处传播。到欧洲人下一次在密西西比河下游出现,即17世纪初法国的移民出现时,所有这些印第安人的大城镇已经消失殆尽。它们的遗迹就是密西西比河河谷的那些大土堆。直到最近我们才知道,构筑这种大土堆的社会,有许多在哥伦布到达新大陆时仍然大部分完好无损,它们的瓦解(可能是疾病造成的结果)是从1492年到欧洲人对密西西比河进行系统勘探这一段时间里发生的。 在我年轻的时候,美国小学生所受到的教育是:北美洲本来只有大约100万印第安人居住。把人数说得这样少,对于为白人的征服行为辩解是有用的,因为他们所征服的只不过是一个可以认为几乎是空无所有的大陆。然而,考古发掘和对最早的欧洲探险者所留下的关于我们海岸地区的描写的仔细研究现已表明,印第安人原来的人数在2000万左右。就整个新大陆来说,据估计在哥伦布来到后的一两个世纪中,印第安人口减少了95%。 主要的杀手是旧大陆来的病菌。印第安人以前从来没有接触过这些病菌,因此对它们既没有免疫能力,也没有遗传抵抗能力。天花、麻疹、流行性感冒和斑疹伤寒争先恐后地要做杀手的头把交椅。好像这些病还嫌不够似的,紧随其后的还有白喉、疟疾、流行性腮腺炎、百日咳、瘟疫、肺结核和黄热病。在无数情况下,白人实际上在当地亲眼目睹了病菌来到时所产生的破坏。例如,1837年,具有我们大平原最精致的文化之一的曼丹族印第安部落,从一艘自圣路易沿密苏里河逆流而上的轮船上感染了天花。一个曼丹人村庄里的人口在几个星期之内就从2000人急剧减少到不足40人。 虽然有十几种来自旧大陆的主要传染病在新大陆安家落户,但也许还没有一种主要的致命疾病从美洲来到欧洲。
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3207-3208的标注 | 添加于 2020年1月28日星期二 下午5:46:47
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
当我们美国人想到存在于1492年的新大陆人口最多的社会时,出现在我们心头的往往只是阿兹特克人和印加人的那些社会。
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3203-3203的标注 | 添加于 2020年1月28日星期二 下午5:49:23
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
到1618年,墨西哥原来2000万左右的人口急剧减少到160万左右。
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3219-3223的标注 | 添加于 2020年1月28日星期二 下午5:50:17
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
在我年轻的时候,美国小学生所受到的教育是:北美洲本来只有大约100万印第安人居住。把人数说得这样少,对于为白人的征服行为辩解是有用的,因为他们所征服的只不过是一个可以认为几乎是空无所有的大陆。然而,考古发掘和对最早的欧洲探险者所留下的关于我们海岸地区的描写的仔细研究现已表明,印第安人原来的人数在2000万左右。就整个新大陆来说,据估计在哥伦布来到后的一两个世纪中,印第安人口减少了95%。
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3223-3225的标注 | 添加于 2020年1月28日星期二 下午5:50:50
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
主要的杀手是旧大陆来的病菌。印第安人以前从来没有接触过这些病菌,因此对它们既没有免疫能力,也没有遗传抵抗能力。天花、麻疹、流行性感冒和斑疹伤寒争先恐后地要做杀手的头把交椅
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3225-3226的标注 | 添加于 2020年1月28日星期二 下午5:50:58
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
好像这些病还嫌不够似的,紧随其后的还有白喉、疟疾、流行性腮腺炎、百日咳、瘟疫、肺结核和黄热病
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3259-3261的标注 | 添加于 2020年1月28日星期二 下午5:54:00
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
梅毒、淋病、肺结核和流行性感冒于1779年随库克船长[5]到来,接着于1804年又发生了一场斑疹伤寒大流行以及后来的许多“较小的”流行病,把夏威夷的人口从1779年的50万左右减少到1853年的84000人。
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3577-3578的标注 | 添加于 2020年1月28日星期二 下午6:47:19
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
正如人类学家克劳德·莱维-斯特劳斯所说的那样,古代文字的主要功能是“方便对别人的奴役”。非专职人员个人使用文字只是很久以后的事,因为那时书写系统变得比较简单同时也更富于表现力。
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3597-3598的标注 | 添加于 2020年1月28日星期二 下午8:59:22
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
文字只在新月沃地、墨西哥、可能还有中国独立出现,完全是因为这几个地方是粮食生产在它们各自的半球范围内出现的最早地区
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3687-3688的标注 | 添加于 2020年1月28日星期二 下午9:36:29
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
问题似乎在他们的社会。否则又怎样来解释澳大利亚东北部的土著为什么没有采用弓箭?而他们见过与他们进行贸易的托雷斯海峡的岛上居民在使用弓箭。
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3695-3697的标注 | 添加于 2020年1月28日星期二 下午9:38:01
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
1942年,当第二次世界大战仍在进行时,美国政府制定了曼哈顿计划,其显而易见的目的就是抢在纳粹之前发明出为制造原子弹所需要的技术。3年后,这个计划成功了,共花去20亿美元(相当于今天的200多亿美元)
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3716-3717的标注 | 添加于 2020年1月28日星期二 下午9:43:39
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
特利布·戴姆勒得以在一辆自行车上安装了一台发动机从而制造了第一辆摩托车
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3730-3732的标注 | 添加于 2020年1月28日星期二 下午9:45:48
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
从专利法律师观点看,最佳的发明就是全无先例的发明,就像雅典娜整个地从宙斯的前额跳出来一样[3]。
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3750-3751的标注 | 添加于 2020年1月28日星期二 下午9:50:58
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
从来就没有这样的人。所有公认的著名发明家都有一些有本领的前人和后人,而且他们是在社会有可能使用他们的成果的时候对原来的发明作出改进的
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3827-3828的标注 | 添加于 2020年1月28日星期二 下午11:58:58
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
在现代的西方,保护发明者的所有权的专利权和其他财产法奖励发明,而在现代的中国,缺乏这种保护妨碍了发明
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3834-3835的标注 | 添加于 2020年1月28日星期二 下午11:59:42
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
对各种观点和异端观点的宽容促进了创新,而浓厚的传统观点(如中国强调中国古代的经典)则扼杀了创新
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3841-3841的标注 | 添加于 2020年1月29日星期三 上午12:01:16
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
在整个历史上,战争常常是促进技术革新的主要因素
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3843-3844的标注 | 添加于 2020年1月29日星期三 上午12:02:15
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
强有力的集中统一的政府在19世纪后期的德国和日本对技术起了推动作用,而在公元1500年后的中国则对技术起了抑制作用。
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
枪炮、病菌与钢铁 : 人类社会的命运 (世纪人文系列丛书·开放人文) (贾雷德·戴蒙德)
|
|
||||||
|
|
||||||
- 您在位置 #3844-3846的标注 | 添加于 2020年1月29日星期三 上午12:04:24
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user