0%

open_vpn_server_tw.jpg

参考自 How To Set Up an OpenVPN Server on Ubuntu 16.04

为什么需要 OpenVPN

对我来讲,有两个原因:

  • 安全地在不安全的网络环境下上网:如需要在酒店、咖啡厅或者不可信任的 Wi-Fi 环境下上网时,我需要确保自己不会被监听。
  • 跨过防火墙,享受自由的网络环境。

那么,为什么我不用 ShadowSocks 呢?答案是,其实我也在用,不过它在 iOS 上的表现确实无法令人满意,另外,PC 端使用 Chrome 配合 ss 翻墙的时候需要很复杂的配置(或许我不会用吧),相比之下, OpenVPN 可以非常方便的全部搞定(除了安装比较复杂)。所以,这篇博客记录下 OpenVPN 服务的安装过程,以供参考。

文中使用的服务器是 Ubuntu 16.04,不过 Debian 系的操作系统应该是可以通用的。

阅读全文 »

在 Python 的世界中,一切皆对象。 int / list / dict / … 都是对象,除此之外,函数、类本身也是对象,那么,这些对象究竟是什么呢?

从结果看,Python 中的对象是 C 语言中结构体在堆上申请的一片内存区域。而在具体实现上,这里先简单描述一下。
obj

阅读全文 »

Python 是一门非常具有包容性的语气,体现在一个优秀的工程师可以非常容易优雅高效地完成一件事情,而一个拙略的工程师通过一样的代码同样可以做到几乎一样的功能。今天,介绍一下 Python 的 Ellipsis~~~

想象这样一个问题:

如何优雅地生成一个等差数组?比如输入一个序列的第一、第二项以及最后一项,然后返回这个等差数组。

阅读全文 »

在Python里试验一下下面的代码:

1
2
3
4
5
6
7
8
9
10
11
a = 1
b = 1
print a is b

a = -5
b = -5
print a is b

a = -6
b = -6
print a is b

输出的结果令人咋舌,竟然会是TrueTrueFalse,是什么原因导致这样的差异呢?

阅读全文 »

第一步,我们想要生成fibonacci数列前N项,我们可以这样做:

1
2
3
4
5
6
def fib(size):
a, b = 0, 1
while size:
print a,
a, b = b, a + b
size -= 1

执行可以得到输出如下:

1
2
In [1]: fib(10)
0 1 1 2 3 5 8 13 21 34

这个函数的问题在于,我们只能调用它输出结果,并没办法拿到返回值,于是通用性不够。现在对这个函数做一点修改如下:

阅读全文 »