我对 KaZaA 的理解

我对 KaZaA 的理解


渊源

KaZaA 是一个基于 FastTrack 协议 的应用
FastTrack 协议是 Gnutella 的拓展,加入了 “超级节点”的概念
在 Gnutella 中,对文件的查询,直接使用洪泛,在邻居节点上迭代,使用 TTL 限制广播长度
而 FastTrack 中,只有超级节点可以洪泛,普通节点只有上传下载的的基本功能

阅读更多
n-gram 手动实现
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
import queue
import math
corpus = r"""ppap ppap ppap
I have a pen , I have an apple .
( Eh~ ) Apple pen !
I have a pen , I have a pineapple .
( Eh~ ) pineapple pen !
apple pen ~ pineapple pen ( Eh~ )
pen pineapple Apple pen !
pen pineapple Apple pen .
you don't have an apple .
I don't have a pen .
he has a pineapple .
he doesn't have an apple !
"""
from collections import defaultdict

class LessThanWin(object):
def __init__(self, s: list):
self.present = s
def size(self):
return len(self.present)
def hash(self):
return ' '.join(self.present)

class NNode(object):
def __init__(self, s: list):
self.given = s[:-1]
self.present = [s[-1]]
def size(self):
return len(self.present)
def hash_given(self):
return ' '.join(self.given)
def hash(self):
return ' '.join(self.given+self.present)

class Que(object):
def __init__(self, maxsize: int):
self.q = []
self.maxsize = maxsize
self.size = 0
def put(self, any):
self.size += 1
self.q.append(any)
if self.size 《 self.maxsize:
return LessThanWin(self.q)
else:
if self.size 》 self.maxsize:
self.q = self.q[1:]
self.size -= 1
return NNode(self.q)

class model_args(object):
def __init__(self,counter_given,counter_present,counter_present_n_1,lenth,win):
self.counter_given = counter_given
self.counter_present_n_1 = counter_present_n_1
self.counter_present = counter_present
self.char_len = lenth
self.win = win
self.sum_n_1 = sum( [v for key,v in counter_present_n_1.items()] )

def train(text:str,window:int):
counter_present = defaultdict(int)
counter_present_n_1 = defaultdict(int) # n-1 初始搭配;我省去了加 n-1 个 BOS 的步骤;其实等价;证明请看 “证明”
counter_given = defaultdict(int) # 只计算该初始 n-1搭配 占所有初始 n-1搭配 的比率
all_char =set()

for line in corpus.split('\n'):
chars = line.strip().split() # char 其实就是词;因为 word 也有句子的意思,我看到的时候很迷茫,所以我用 chars 代表 词
q = Que(window)
for ch in chars:
all_char.add(ch)
node = q.put(ch)
if type(node).__name__ =='LessThanWin':

if node.size() == window-1:
counter_present_n_1[node.hash()]+=1;
else:
counter_given[node.hash_given()]+=1
counter_present[node.hash()]+=1;

return model_args(counter_given,counter_present,counter_present_n_1,len(all_char),window)

def predict(s:str,model:model_args):
counter_given,counter_present,counter_present_n_1,charV,window = model.counter_given,model.counter_present,model.counter_present_n_1,model.char_len,model.win
# 这句话就是 从 model_args 里边读参数,没别的意思
n_1_all= 0;
chars = s.split()
q = Que(window)
p = 0
for ch in chars:
node = q.put(ch)
if type(node).__name__ =='LessThanWin':
if node.size() == window-1:
p += math.log10( (counter_present_n_1[node.hash()]+1.0)/(model.sum_n_1+charV) ) ; #加1平滑
else:
p += math.log10( (counter_present[node.hash()]+1.0) /(counter_given[node.hash_given()]+charV) )

return p;

if __name__ == "__main__":

test_list=[
'I have a pen .',
'you have a pen .',
'I am a pen .',
'he are a apple .',
'he has a pen .',
'ppap ppap ppap']
win = 3 #win 即 n-gram 的 n;不要开太大,因为我的语料库就很小
model = train(corpus,win)

for sentence in test_list:
p = predict(sentence,model)
print(sentence,' log10(p)=',p)

证明

阅读更多
动态列表爬虫教程

我去网上找关于“化学”的专业网站,但是没有找到。只找到两个简陋的论坛,里边都是些一两句话组成的帖子。然后到知乎上问,有什么关于“化学的网站”,还是没找到。我转念一想,直接爬知乎不就行了嘛。

问题下的答案:

以“有哪些绝对不能触摸的化学药品?”为例:

知乎的网页都是动态,你把窗口滑到底部,它就自动加载内容。这样似乎给爬虫造成了难度,实际上造成了巨大的便利。我来说说我是怎么找到他的api 的。

阅读更多
今天我被黑了

今天是特别的一天


老子被黑客黑了,写的markdown全不见了,恢复无望。

早上5点左右,腾讯云给我发消息

有木马程序在运行,请前往处理。我实在想不清楚,既然你知道有黑客在捣鬼,为什么不直接处理掉,通知我干啥?收保护费吗?呵。

8:50 起床看看

我登陆自己的账户时,发现需要输入密码,我的想法是黑客把我的密码改掉了,因为我早就设置了密钥登陆,用我的电脑根本不需要手动输入密码。
我查看了 authorized_keys 发现自己的公钥已经被删除,那里杵着一条丑陋的公钥

1
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr

呵,用户名都这么粗鲁“mdrfckr == mother fucker?”
于是我把自己的公钥重新写上去,重启后使用免密登陆,发现失败了。这个东西又自己出现了。
额,重复修改自己的公钥,真和国内的流氓首页有点像啊。

阅读更多