笔记

shadowsocks客户端启动报错问题

问题描述

1
sslocal -c shadowsocks.json

报如下错误

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
INFO: loading config from shadowsocks.json
2020-02-11 10:50:45 INFO loading libcrypto from libcrypto.so.1.1
Traceback (most recent call last):
File "/usr/local/bin/sslocal", line 11, in <module>
sys.exit(main())
File "/usr/local/lib/python2.7/dist-packages/shadowsocks/local.py", line 39, in main
config = shell.get_config(True)
File "/usr/local/lib/python2.7/dist-packages/shadowsocks/shell.py", line 262, in get_config
check_config(config, is_local)
File "/usr/local/lib/python2.7/dist-packages/shadowsocks/shell.py", line 124, in check_config
encrypt.try_cipher(config['password'], config['method'])
File "/usr/local/lib/python2.7/dist-packages/shadowsocks/encrypt.py", line 44, in try_cipher
Encryptor(key, method)
File "/usr/local/lib/python2.7/dist-packages/shadowsocks/encrypt.py", line 83, in __init__
random_string(self._method_info[1]))
File "/usr/local/lib/python2.7/dist-packages/shadowsocks/encrypt.py", line 109, in get_cipher
return m[2](method, key, iv, op)
File "/usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/rc4_md5.py", line 33, in create_cipher
return openssl.OpenSSLCrypto(b'rc4', rc4_key, b'', op)
File "/usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py", line 76, in __init__
load_openssl()
File "/usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py", line 52, in load_openssl
libcrypto.EVP_CIPHER_CTX_cleanup.argtypes = (c_void_p,)
File "/usr/lib/python2.7/ctypes/__init__.py", line 379, in __getattr__
func = self.__getitem__(name)
File "/usr/lib/python2.7/ctypes/__init__.py", line 384, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1: undefined symbol: EVP_CIPHER_CTX_cleanup

nginx配置结构说明

最近做项目发现服务器上nginx的配置很混乱,主要原因就是配置的人不太了解nginx的配置。从网上查了资料之后就复制了。

配置结构

nginx的配置其实很简单,总共也就分为4部分:main(全局设置)、server(主机设置)、upstream(负载均衡服务器设置)和 location(URL匹配特定位置的设置)
他们的关系是,server继承main,location继承server,upstream既不会继承其他设置也不会被继承。
所以配置的优先级就是 location > server > main

limits.conf配置说明

最近发生了奇怪的事情,mysql总是会连不上,查了半天原因,最后发现进程文件没有生成。es报警“Too many open files”。搜索才发现是,打开文件太多了,超过了限制。解决方法是修改/etc/security/limits.conf。另外还牵扯到了另一个配置file-max。经过调试还是踩了不少坑的。坐下笔记,防止重复踩坑。

js实现防抖和节流

防抖和节流是避免过度处理的有效手段。目的就是为了解决一些事件频繁的触发问题。

防抖

先说一下防抖,当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时。

通俗易懂点就是,领导安排任务,你得等领导全部说完了再去做,不能说一个就跑去做了,你得等领导说完。

举个很典型的例子,搜索提示是个很典型的使用场景。每次输入框的内容发生更改就会发送一个请求,这其实是没有必要的。
理想的方式应该是当用户不在输入时,在发送请求。怎么确定用户停止输入呢?我们定义一个等待时间,比如500ms。当用户停止输入500ms后发送一个请求。
500ms内如果在不停的输入内容,那我们就重新重新计时。

Commit log 使用说明

什么是git commit log

git commit log其实就是根据咱们提交的commit message信息进行提取,用来生成更新日志的功能。
既然是要生成,那就一定要有一个格式,否则程序很难自动化的处理。
目前比较常用的是Angular 团队的规范,他的格式也比较简洁。

解决element ui el-select控件多选时option设置为disabled,但可以删除标签,造成无法恢复的bug

问题起因

今天遇到一个问题,需求是,客户选择栏目时,不属于自己的栏目不可修改。但需要显示出来。实现需求使用了element ui的el-select组件。
对于已选栏目的显示,和对栏目的选项取消都比较好。不属于自己的栏目使用了option的disabled属性。列表中的选项控制正常,对于disabled属性为true的元素不可选。
但是在展示已选则的栏目时,option中禁用的选项依然有删除的小叉号。而且还是可以使用的,点击后就被删除了。在列表中的选中状态也取消了。这可闹大了,没法恢复啊。

解决思路

思路很简单,在对选项进行移除时做个判断。如果选项是禁用的,就不操作。
实现中用到了value属性,用于显示备选项。change事件用于处理选中的值,remove-tag事件处理移除选项时的判断
有几个问题需要注意,事件的执行顺序是先出发change后出发remove-tag所以要让数据返回变为异步,保证remove-tag事件完成后在返回数据

vue中使用neditor

neditor是从ueditor改写过来了,做了不少优化,我最喜欢的就是去掉了服务端附件配置请求。还有一个有点就是,可以很方便的对接七牛cdn或oss。
如果是简单的使用可以用vue-neditor-wrap,复杂场景下会有bug,所以自己写了个组件,将必要的js引入放到了index.html中。下面是使用注意事项,追后有本示例的源码。