我们不能失去信仰

我们在这个世界上不停地奔跑...

0%

作为一个程序员,在公司基本上都是使用gitlab来对项目代码管理,但是作为一个初级的搬砖工,也就只有简单的push、pull和创建分支,修改wiki 的权限。工作之中考虑到许多代码都是可以复用的,需要用到的时候,又找很久,后面索性不找了,直接重写一遍。

在一个比较大的项目中,添加某些重复的功能,如果不能把它记下来,就只能一点点看源码,然后再添加,这感觉实在太痛苦。 既然 gitlab 可以管理代码,那写一个自己的工作总结及代码整理,开发流程岂不是挺好。

蜗牛星际矿渣主机

首先黑群晖配置是j3455 B款 双网口,8G内存,就是想装 gitlab 和 docker 和虚拟机所以把内存升级到了8G, 拆开机箱,看里面最多也只能插入一条内存条。

  • 黑群晖,拿到蜗牛星际立马安装了黑群晖,考虑到都是工作之中的积累及代码记录,所以还是稳点比较好,准备买四块硬盘,两块做raid 0 两块一个做下载盘,一个做影音盘。

  • 黑群晖中 vmm 虚拟机,做软路由。 已经关注了华硕 ac 86u 很久,但是价格一直坚挺,并且家里已经有一个废物的小米路由ac2100,无法刷机,所以再买一个路由还真有点舍不得。以前是在小米路由后面再加一个 斐讯K2, 然后 斐讯 K2 专门给投影仪这样不方便安装科学客户端的设备使用,小米路由是千兆,K2 是百兆,而我家宽带又是200兆的,所以加上光猫,光路由设备就有三台了,考虑到功耗,感觉有必要重新配置一下,就入手了星际蜗牛,使用 vmm 搭建了软路由。

    具体连接方式:光猫桥接然后光猫连接蜗牛星际其中一个网口,然后蜗牛星际另一个网口连接小米路由器的 wan 端口。这样小米路由器只充当了一个发射无线AP的WIFI的设备。拨号是放在软路由里面做的,科学及一些有用的插件都放到软路由里面。关于软路由lede群晖vmm安装网上已经有很多教程了。

    阅读全文 »

购买了一台蜗牛星际B款双网口,装了黑群晖加软路由lede。再上一遍教程中,写了将光猫设置为桥接的方法。一切就绪就等着使用软路由拨号上网了。

软路由拨号不如光猫是什么问题

软路由刚开始设置的时候,拨号一直连不上,总是错误不断,然后就关闭ipv6, 开启ipv6,把某些特殊的设置屏蔽掉,我用的是lede 软路由系统,我第一次拨号,他会显示User Request 错误,不过不用管它,过几十秒他就自己变好了。但是速度巨慢,我家是 200M 的网络,使用光猫拨号随便跑到200多,但是使用软路由拨号成功后去测试,只有 四五十兆左右。 当时做了以下猜测:

  • 蜗牛星际性能不行

    通过实验进行对比,可以判断不是蜗牛星际的问题。首先光猫拨号,然后连接软路由(蜗牛星际中虚拟机设置的wan端口),然后蜗牛软路由lan口(蜗牛星际虚拟机中设置为lan的端口)连接千兆路由器,然后电脑通过wifi连接千兆路由器,测试发现网速可以跑到两百多兆,这说明流量在通过这一连串的设备时,并没有因为哪个设备的性能不行导致网速下降的。所以应该不是蜗牛星际的问题。

  • 运营商绑定了mac地址,或者对陌生设备拨号做了限制

    想要证明这点,我直接把端口不连软路由,直接连接千兆路由器,让千兆路由器进行拨号,拨号的结果和光猫拨号速度差不多,所以说应该也不是运营商的问题。期间我还试过把路由器拨号的mac地址改为软路由的地址,发现网速照样很快,那就说明并不是运营商进行了限制,问题出在了软路由这里。

    阅读全文 »

  1. 进入光猫管理员登录界面

    http://192.168.1.1/CU.html

    然后选择管理员登录

WX20200407-2059152x

我是广州联通,广州联通的默认密码是 cuadmin + 路由器背面的mac地址前6为,把 ‘-’ 去掉,字母小写。

如果可以成功登录,接下来可以查看自己是公网ip还是内网ip,最简单的方法就是打开 https://www.ip138.com/ 看上面显示的 ip 地址和自己路由器里面的一不一样,一样就是公网ip。

1586264550012

阅读全文 »

可插拔视图

MethodView 主要可以实现两个功能:

  • 基于方法调度

    对于 RSET 式 API 来说,继承 MethodView 后,每个 HTTP 方法都映射到一个同名的函数(函数名称为小写字母)。可以在类里面定义 get、post、delete、put 等方法。使用这种方式,不必提供 methods 属性,它会自动使用相应的类方法。

  • 装饰视图

    自 FLask 0.8 版本开始,新加了一种选择:在视图类中定义装饰的列表:

    1
    2
    3
    <!--more -->
    class UserAPI(MethodView):
    decorators = [user_decorator]

    请牢记:因为从调用者的角度来看,类的 self 被隐藏了,所以不能在类的方法上单独 使用装饰器。(是这个类里面定义的方法不能使用装饰器吗? 但是我如果继承自 UserAPI 后,新的类里面方法还是可以使用装饰器)

官方文档

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
class PrintClassName(object):

def __init__(self, cls):
self._cls = cls

def __call__(self, *args, **kwargs):
"""
如果在类中实现了 __call__ 方法,那么实例对象就是一个可调用对象。 相当于 PrintClassName() 的时候回执行 __call__ 的内容
"""
print('我是 PrintClassName')
<!--more -->
print(self._cls.__name__)
return self._cls(*args, **kwargs)


@PrintClassName
class Person(object):
def __init__(self, a):
print('执行 Person __init__')
self.value = a

def sing(self):
print(self.value)


person = Person('今天又是充满希望的一天')
person.sing()
"""输出:
我是Foobar类
我是 PrintClassName
Person
执行 Person __init__
"""

"""
执行流程: 1. 创建 Person 前,先创建 PrintClassName,执行 __init__ 方法
2. 执行 PrintClassName 的 __call__ 方法
3. __call__ 返回创建 Person 的 type ,开始创建 Person ,执行 Person 的 __init__方法
4. person 自己调用 singl() 方法

看一下传入的东西是什么: 加入下面这句话到 PrintClassName 的 __init__ 方法里。
print(type(cls))
输出
<class 'type'>
说明传入的是创建 Person 使用的 type 。

"""

总结:

​ 装饰器装饰类的时候,其实是在创建类对象之前,执行装饰器里的操作,并且把创建类的 type 对象传递进去, 装饰器执行完后,返回创建对象的东西,然后才会创建对象。

新式类和经典类

在 Python 2.x 中默认都是经典类,在 Pyhton 3.x 中默认都是新式类

新式类和经典类的区别: 只有显示继承了 object 才是新式类

用法上的区别:

  • 新式类对象可以直接通过 __class__ 属性获取自身类型为 type
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# coding:utf8

# 新式类
class demo(object):
pass

print demo.__class__

经典类
class demo1:
pass

print demo1.__class__

<type 'type'> # 新式类的输出
Traceback (most recent call last): # 经典类不包含 __class__ 属性
File "1demo.py", line 13, in <module>
print demo1.__class__
AttributeError: class demo1 has no attribute '__class__'
阅读全文 »

交互式环境测试

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
Python 2.7.16 (default, Sep  2 2019, 11:59:44)
>>> class A(object):
... def foo(self):
... pass
...
>>> a = A()
>>> print A.foo
<unbound method A.foo>
>>> print a.foo
<bound method A.foo of <__main__.A object at 0x10e767990>>
>>>
>>>
>>> print 1, id(a.foo)
1 4536864272
>>> print 2, id(a.foo)
2 4536864272
>>> print a.__dict__
{}
>>> m1 = a.foo
>>> m2 = a.foo
>>> print 3, id(m1)
3 4536864272
>>> print 4, id(m2)
4 4537385200
>>> print 5, id(a.foo)
5 4536864672
>>> m2 = None
>>> m1 = None
>>> print 6, id(a.foo)
6 4536864272
>>> print dir(A)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'foo']
>>> m1 = A.foo
>>> m2 = A.foo
>>> print 7, id(m1)
7 4536864272
>>> print 8, id(m2)
8 4537385200
>>> print A.__dict__['foo']
<function foo at 0x10e76a5f0>
>>> m1 = A.foo
>>> m2 = a.foo
>>> print m1.im_self
None
>>> print m2.im_self
<__main__.A object at 0x10e767990>
>>> print m1.im_func, m2.im_func
<function foo at 0x10e76a5f0> <function foo at 0x10e76a5f0>
>>> print m1.im_class, m2.im_class
<class '__main__.A'> <class '__main__.A'>
>>>
阅读全文 »

使用 Python2 中的 requests 访问 https 网站的时候,会出现这样的错误:

1
requests.exceptions.SSLError: [Errno 1] _ssl.c:503: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

原因是: Python 2.x 不支持 SNI。

SNI

全称 Server Name Indication。 SNI 是 TLS 的一个扩展

了解 https 的人都知道,https 会首先建立 SSL 握手,然后才会传输数据。

阅读全文 »

rsync

rsync 可以用来做代码同步。以前还没接触这个工具的时候,都是用 scp 上传到服务器,然后在测试,有些麻烦,有时候索性就到服务器改了,所以最后造成代码不一致,引起诸多麻烦等等。

rsync 一般用法:

1
rsync -auv --progress /Users/home/project/project_finder zhaochen03@106.2.67.13:/home/username/.

这里需要注意: 如果ssh端口不是 22 端口,比如ssh端口是 2222,需要加上端口号:

1
2
<!--more -->
rsync -auv --progress /Users/home/project/project_finder zhaochen03@106.2.67.13:/home/username/. -e " ssh -p 2222"

其底层是基于 SSH 的。如果在 ~/.ssh/config 中配置了信息,则可以直接:

1
rsync -auv --progress /Users/zhaochen/Netease/dsp ali:/home/zhaochen03/.

  1. rsync 默认增量同步,比如 Python 中某个目录以前生成了 pyc 文件,但是后来把文件移动到另一个目录,而忘记更改 import 的路径,这样在服务器上是可以继续运行的,因为那个路径下是存在 pyc 文件的,而上线另一台服务器的时候就会报错。

  2. rsync 同步的时候,是基于文件修改时间同步的,如果服务器上的文件修改时间新, 本地旧, 则从本地 rsync 就不会同步过去。

遇到的问题

​ 当使用 requests 的 post 进行表单提交的时候,其中包含 file 和 data。 如果 filename 为中文,则会对 filename 进行 编码成:

filename* = utf-8…………… 的样子,导致服务器无法正常接收文件。

环境

requests 2.13.0

暂时略去其他环境问题,主要是 requests 库

阅读全文 »