0%

一般来说,我们在设计与人有交互的系统时,如果涉及到多用户能对同类资源进行操作的时候,就会有区分权限的需求了。

ACL(Access Control List)

ACL是最早也是最基本的一种访问控制机制, 它的原理非常简单:每一项资源,都配有一个列表,这个列表记录的就是哪些用户可以对这项资源执行CRUD中的那些操作。 当系统试图访问这项资源时,会首先检查这个列表中是否有关于当前用户的访问权限,从而确定当前用户可否执行相应的操作。

如:

1
2
Alice -> read:article, update:article
Bob -> read:article, del:article

通过ACL表,我们可以很容易的使用程序判断出用户的权限。我们在设计RESTFUL接口时,权限可以设计为:

1
2
Alice -> GET /article, PUT /article
Bob -> GET /article, DELETE /article

ACL缺点也是很明显的,首先需要维护大量的访问权限列表,它在性能上有明显的缺陷。 另外,对于拥有大量用户与众多资源的应用,管理访问控制列表本身就变成非常繁重的工作。

Read more »

无论是做科学计算,还是数据挖掘,或者一些其他工程项目,我们经常需要比较字符串的相似度。

这里罗列一些常用的相似度计算方法,仅供参考。

余弦相似性(Cosine similarity)

余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。 0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。 从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。 两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0; 两个向量指向完全相反的方向时,余弦相似度的值为-1。 这结果是与向量的长度无关的,仅仅与向量的指向方向相关。余弦相似度通常用于正空间,因此给出的值为0到1之间。

注意这上下界对任何维度的向量空间中都适用,而且余弦相似性最常用于高维正空间。 例如在信息检索中,每个词项被赋予不同的维度,而一个文档由一个向量表示,其各个维度上的值对应于该词项在文档中出现的频率。 余弦相似度因此可以给出两篇文档在其主题方面的相似度。

另外,它通常用于文本挖掘中的文件比较。此外,在数据挖掘领域中,会用到它来度量集群内部的凝聚力。

Read more »

OSError: Command /home/username/xxx/bin/python3 - setuptools pkg_resources pip wheel failed with error code 2

今天在使用virtualenv创建虚拟环境的时候报错, 一通查找之后发现是setuptoolsvirtualenv版本太旧的问题:

1
pip install -U setuptools virtualenv

在用Hexo写文章时,经常需要引用自己的文章,而文章在发布之后地址为/年/月/日/文章名, 这样的话,使用markdown格式([]())引用的话会变得很不方便。

万幸的是,hexo提供了内置的语法来引用文章:

1
{% post_link 文章文件名(不要后缀) 文章标题(可选) %}

例如:

1
2
{% post_link Hello-World %}
{% post_link Hello-World 你好世界 %}

要实现进度条功能,只需要注意以下两点就可以做到:

  • 使用\r符号,从行首进行输出
  • print时不要换行,即使用end=''
Read more »

Python有以下关于属性访问的魔法方法:

  • __getattr__(self, item): 访问不存在的属性时调用
  • __getattribute__(self, item): 访问属性时调用(先调用该方法,查看是否存在该属性,若不存在,则继续调用方法__getattr__
  • __setattr__(self, key, value): 设置对象属性时调用
  • __delattr__(self, item): 删除属性时调用
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
class Test:
def __getattr__(self, item):
print('__getattr__')

def __getattribute__(self, item):
print('__getattribute__')
return super().__getattribute__(item) # or: object.__getattribute__(self, item)

def __setattr__(self, key, value):
print('__setattr__')
super().__setattr__(key, value) # or: object.__setattr__(self, key, value)

def __delattr__(self, item):
print('__delattr__')
super().__delattr__(item) # or: object.__delattr__(self, item)

>>> test = Test()
>>> test.a
__getattribute__
__getattr__
>>> test.a = 1
__setattr__
>>> test.b
__getattribute__
1

If语句

if语法格式如下:

1
2
3
4
5
6
7
if condition1; then     # if语句块,必须出现一次
...
elif condition2; then # elif语句块,可出现0次或多次
...
else # else语句块,只能出现0次或1次
...
fi

示例,判断两个数是否相等:

1
2
3
4
5
6
7
8
9
10
11
a=10
b=20
if [ $a == $b ]; then
echo "a 等于 b"
elif [ $a -gt $b ]; then
echo "a 大于 b"
elif [ $a -lt $b ]; then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
Read more »

go modules是golang1.11新加的特性。将环境变量GO111MODULE设置为on来开启modules功能。

go mod命令

golang提供了go mod命令来管理包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ go help mod
Go mod provides access to operations on modules.

Note that support for modules is built into all the go commands,
not just 'go mod'. For example, day-to-day adding, removing, upgrading,
and downgrading of dependencies should be done using 'go get'.
See 'go help modules' for an overview of module functionality.

Usage:

go mod <command> [arguments]

The commands are:

download download modules to local cache
edit edit go.mod from tools or scripts
graph print module requirement graph
init initialize new module in current directory
tidy add missing and remove unused modules
vendor make vendored copy of dependencies
verify verify dependencies have expected content
why explain why packages or modules are needed

Use "go help mod <command>" for more information about a command.
Read more »