a cup of vps

习惯了谷歌搜索,还真的离不开了… (注:本文更新过)

Buy VPS

购买个VPS吧,选了款便宜点的,bandwagon 19.9$/Y(支持支付宝付款),这个我是新来的,就不搬门弄斧了…
购买成功后,操作系统选Ubuntu16.04,和我现在用的一样,主要是方便,首次密码登录添加公钥,安卓可以使用JuiceSSH客户端。。。

shadowsocks

先装个服务吧,本着不折腾的折腾原则。

server

先启动个服务吧,脚本奉上:

1
apt-get update && apt-get -y install python-pip && pip install -U pip && pip install shadowsocks

安装完毕,可以直接用命令ssserver启动服务,推荐写个json,参数不懂问man老师,或者帮助,官网文档都可以。

1
2
3
4
5
6
7
8
9
10
11
echo '{
"server":"0.0.0.0",
"server_port":88,
"password":"yourpassword",
"timeout":300,
"method":"aes-256-cfb",
"fast_open": false
}
' > /etc/shadowsocks.json

ssserver -c /etc/shadowsocks.json

至此服务端启动OK,其中端口和密码自己设置。

client

安装方式一样,只是启动的时候用sslocal命令,可以直接指定参数启动,也可以写个配置文件。
推荐火狐浏览器,因为火狐浏览器有单独的网络配置,而chrome等用的系统代理配置。

nginx

大家对nginx和gunicorn(uwsgi的一种)一定不陌生,其中有个名词叫反向代理,我的理解nginx反向代理是,自己有的(像js,css之类的)直接给你,没有的,去找gunicorn取来后给你。

Apply

“Nginx, Show me google homepage…” 没有取了来给我,哈哈哈 :)
不要想太复杂,Github上有现成的(我不喜欢编译,但偶尔编译下还是可以滴),注有个组建我更新了下,然后configure命令修改后是下面这样的:(前两个版本号稍有更新)

1
2
3
4
5
6
7
8
9
10
11
apt-get -y install build-essential git gcc g++ make && mkdir wen.lu && cd wen.lu && git clone https://github.com/cuber/ngx_http_google_filter_module && git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_module && wget "http://nginx.org/download/nginx-1.10.2.tar.gz" && tar xzvf nginx-1.10.2.tar.gz && wget "ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.gz" && tar xzvf pcre-8.39.tar.gz && wget "http://zlib.net/zlib-1.2.8.tar.gz" && tar xzvf zlib-1.2.8.tar.gz &&  wget "https://www.openssl.org/source/openssl-1.1.0c.tar.gz" && tar xzvf openssl-1.1.0c.tar.gz && cd nginx-1.10.2 && \
./configure \
--prefix=/opt/nginx-1.10.2 \
--with-pcre=../pcre-8.39 \
--with-openssl=../openssl-1.1.0c \
--with-zlib=../zlib-1.2.8 \
--with-http_ssl_module \
--add-module=../ngx_http_google_filter_module \
--add-module=../ngx_http_substitutions_filter_module && \
make && \
make install

下来修改下配置,修改的地方如下:

1
2
3
4
5
resolver 8.8.8.8;
location / {
google on;
google_language "ca";
}

然后启动ngins,访问[My VPS HIDE],久违的谷歌出现了。
http支持了,https如今也已经支持,使用Let’s encrypt证书,使用证书需要域名,免费域名申请的较晚,所以https及证书支持较晚。

the End

all in one last. 感谢阅读,我本地代理默认监听0.0.0.0,局域网的小伙伴有福了哈。

remote debugger

你没有看错,Python Remote Debugger with PyCharm!本文是基于Python IDE:PyCharm,主要介绍 Remote Debugger 的在 PyCharm 中的配置使用,本文希望传递一个消息,远程是可在IDE调试的,也希望大家能在以后的工作中调试起来…。

Debug Configurations

先上图:
Debug Configurations

  • 1: 这是一个django服务的示例
  • 2: 选择的是服务器(Remote)运行环境interpreter
  • 3: 本地和远端path mapping

SSH

SSH最基本的通讯协议,服务器和测试服务器没有不开的吧。

Remote Interpreter

Interpreter 解释器,使用python的对虚拟环境virtualenv应该都不陌生,我们首先需要一个和服务器一样的运行环境。
Setting add Interpreter
按照顺序操作到4,点击Add Remote(如下图),SSH配置完点OK。
Configure Remote Python Interpreter
初次连接可能弹出提醒,确认即可,然后会回到设置主界面,切记点击ApplyOK

config mapping etc

Configure Server
单击向下的那个箭头,然后编辑配置,就回到了最开始那个图,配置好后用debug方式启动就可以远程调试了,吼吼

Linux

远程调试已经完了,你可以很方便的在你本地以调试方式启动服务,在本地设置断点,然后使用服务器ip访问,捕获到断点是不成问题的,修改代码,PyCharm 也有同步的功能,但我还是喜欢下面的~

sshfs

Linux,所以直接挂载测试服务器文件:
$ sshfs -o idmap=user root@10.65.200.151:/opt/disk2/var/www/V6.3.1 /local/mount/point
直接将服务器目录挂载到本地,实质就一份文件。(避免和线上配置可能的冲突)
附:取消挂载的命令$ fusermount -u $point

Windows

感谢永哥,在windows下实现了,给大家扫雷了。在用户目录下新建.ssh文件夹和known_hosts文件,不然远程环境会无法建立。
虽然用不了sshfs,但是可以sftp的,配置远程文件时,需要明确选下如图,虽然选后路径不变:
Remote Host File
不选的话,远程文件可能不识别,识别后远程文件显示为绿色。

总结

本文希望能传递一个消息:远程是可调试的!希望大家以后能用起来,以后如何用好还请大家思考。最后,欢迎任何反馈。

rege guide

不知不觉系统的学习正则已经一年了,特撰此文。推荐教材《精通正则表达式》英文名:”mastering regular expressions”,作者:Jeffrey E. F. Friedl。注:如果你看中文版时觉得代码有问题,请看原版,至少看原版的代码。

开门见山

元字符什么的我就不说了,先说说“环视”。顾名思义环视就是环顾四周,周围是根据当前位置(描点)确定的。环视的作用是环顾四周,但并不匹配(捕获)周围字符。根据描点的前面或后面,是或不是分为四种:正向肯定环视、正向否定环视、逆向肯定环视和逆向否定环视。

说了环视,下来说捕获。捕获有捕捉,获取拿到之意。初学正则时,使用的都是捕获,如\s:捕获一个空白;\d+: 捕获至少一个数字。既然有捕获,就有非捕获,这里要说明的是环视是不捕获的,环视会确定一个位置点。

速度:这里单指正则表达式的速度,如何写出速度更高的正则。不匹配时,要加快匹配失败的速度,同时要减少回溯。正则要尽可能的准确的描述,如指定^$中的一个或都指定。+++?指的是匹配优先,和忽略优先,前者一次匹配尽可能多的字符,后者则一个一个匹配。

这是我们讲回溯,我的理解是:回溯是将已经匹配了的字符吐出来,尝试再次匹配。

总结

未完待续
本文目的不是教会正则,如果能通过本文对正则产生兴趣足以,那本书写的很好,很是推荐。

django advanced

本文记述我在使用Django时遇到的两个问题,两次被坑的过程,也是两次进步的过程。

qs[m:n].update()

业务我就不多说了,给queryset(总数可能有十万之多)中的部分(以万记)更新某个字段(或者说分配到某个订单),由于要保证互斥,同时希望序列号连续(对应实体的东西,方便分取)所以使用select_for_update(),当然任何使用锁的地方应该确保尽可能少锁,同时尽快释放。

问题出来了,如此多的数据,如果循环更新,锁的时间将会比较长,可是Django不支持切片后更新。办法:

qs[m:n].update()
1
2
3
qs = Models.objects.filter(...).select_for_update().order_by("id")
rows = qs.filter(id__lt=qs[count:count+1].get().id).update(...)
assert(rows == count) # TODO: remove

qs.distinct().aggregate()

相信熟悉SQL的同学对distinct一定不陌生,加上MySQL后端,就出了这个问题。由于冗余条件的存在,所以qs里面出现了重复数据,这里就不赘述了。(注:当时使用的是Django==1.5.8,django不支持distinct(field)) So:

qs.distinct().aggregate()
1
2
3
qs = Models.objects.filter(...)
qs = Models.objects.filter(pk__in=qs) # distinct
sum_dict = qs.aggregate(...)

没错,就是多操作了一步。解决方法就是这么简单,可是这个重复数据并不总是有,让我头疼了好一阵子,不过还是被我给揪出来了。

总结

第二个问题环境:MySQL数据库后端 + Diango<1.6。当然如今我们都升1.7了,不过我还是记录下。

advanced linux

本文介绍几个Ubuntu进阶的操作。

先晒晒我信攥的电脑

  • CPU:E3-1231 V3 (3.4GHz*8 志强四核八线程)
  • 内存:Kingston 8G (骇客神条 1866MHz)
  • 主板:ASUS B85-PLUS R2.0
  • 显卡:NVIDIA GeForce GT 730

CPU,内存没得说,显卡很一般,Linux用完全足够了,如果想超频主板可用Z97K,我不超频也足够了

显卡驱动

志强CPU不集成GPU,所以需要独立显卡,显卡驱动是避免不了的。更多关于显卡的介绍,推荐

官方闭源驱动

官网按型号下载驱动,然后进入命令行(tty1-6),关闭Xorg,sh装驱动,然后启动Xorg。

1
2
3
sudo service lightdm stop
sudo sh NVIDIA-Linux-x86_64-346.35.run
sudo service lightdm start

包管理器直接装

sudo apt-get install nvidia-331 nvidia-prime nvidia-settings
331是我装时候仓库中最新的。

装完后,不测试下?

工具: glxgears
奇怪,人家都说是评分多少万,为啥我的几乎定在60FPS? 原来是设置里开了,垂直同步,取消后评分正常。

GRUB2 引导

(Ubuntu 14.04下)grub引导选项主要是由/boot/grub/grub.cfg控制的,不过这个文件是自动生成的,我们一般编辑/etc/default/grub,然后通过命令sudo update-grub应用改动。

常用选项

  • 启动顺序 GRUB_DEFAULT 默认是0
  • 延时时间 GRUB_TIMEOUT 就是显示grub菜单的时间(单系统默认不显示,开机按Shift即可。)
  • 想开机进命令行修改 GRUB_CMDLINE_LINUX_DEFAULT="text"
  • 添加内核参数 GRUB_CMDLINE_LINUX="" 添加你想加的参数,如reboot=a

无论修改什么,都别忘了修改后更新grub!

新内核

说到内核,你知道你的内核版本么?还记得命令uname -r吧。

编译内核

我编译过内核,那是因为第一次主板有问题,关机后自动重启,我由于设备教新,所以怀疑驱动等问题。按照wiki我尝试修改了CPU选项和电源选项,不过后来确认是主板问题,跑华硕售后,确认主板有问题,然后换了主板。我不敢大言不惭教大家编译内核,我想说的是新内核源里就有,用新内核不一定需要自己编译。还有我想说的是编译过程比较久,我3.4GHz*8的主频,需要1h这么久。

装新内核

就不教大家装包了,大家都会。不过我想提醒大家的是,装新内核时有几个包需要统一装,不要漏了哪个。

apt-get install linux-headers-x.xx \
        linux-headers-x.xx-generic \
        linux-image-x.xx-generic \
        linux-image-extra-x.xx-generic```
四个包,x.xx是版本号,自行替换。

目前源里版本更新到3.16.0-31了,Linux内核最新版本已经到4.0了,告诉大家个好消息,4.0版本以后,Linux再也不要求大家重启了,厌倦了Windows反复重启的可要牢记哦。

## 总结
最后再次提醒大家修改grub设置后,不要忘记update-grub哦。

assembled computers

欣赏台式机的性能,所以一直计划这亲自攥台PC,话说我真不懂攥机,权当是分享下“失败”的经验吧。

配单

  • CPU:E3-1231 V3 (3.4GHz*8 志强四核八线程)
  • 内存:Kingston 8G (骇客神条 1866MHz)
  • 主板:ASUS B85-PLUS R2.0
  • 显卡:NVIDIA GeForce GT 730
  • 硬盘:希捷1T,7200转 (机械硬盘)
  • 键鼠:DeLUX竖式鼠标, PERIXX分离式键盘 (有线,人体工学)
  • 电源:航嘉400W

我曾想过,用i5集显(i5性价比较高,所以没选i7),不过最后还是用E3独显了。(E3不集成GPU,所以需要配独显)

问题

我新组的电脑装了Ubuntu,然后无法关机,关机后等3s自动重启。。。

起初,我怀疑是Linux系统问题,内核都编译了(主要修改CPU和电源相关选项,CPU果然给力,一个小时内就可编译完毕),后来用WinPE试,还是关不了,然后用Windows试,装了官方驱动,还是关不掉…

几经折腾,最后断定是主板问题,跑了趟赛格,更换了主板(还好没有超过一个月包换)。
一切正常了。。。

总结

用Linux容易,做Linux不易,且行且珍惜。。。

come back

我想家了,从大学开始,我距离家跨好几个省,在外边过的还算适应,一切也还好。工作后每年回一次家,可是就回这一次家,火车票买不到,我不得不考虑下在家附近工作了…

Compare

最近陷入深深的矛盾中,平时休息离家太远压根不可能想回家,过年一般也就七八天假,难得有一次要回家,可恶的12306,我没用任何刷票软件,我只是没有用IE罢了。我做好了一切准备,或许只是因为我准备了,换来了12306的“非法提交”,然后没然后了,我只是有点儿再也不想抢长途火车票的想法了…

无可否认上海很不错,但我决定回家了,回家是不需要理由的,但:

  • 过年时节,再也不用受12306的气了
  • 到家那天,算好的是母亲生日
  • 让父母享受下现代科技,和远嫁连云港的姐姐视频聊天
  • 放假时节,想回家就到家了…

总结

短短一年时间,辞职两次,一次为了Linux,一次为了回家。裸辞两次,裸辞是一种态度——心无旁骛

learn linux

许多尝试过Linux过的,说起Linux总是一堆问题,外加一堆不习惯。我厌倦了Windows,尤其是中国特色下的 Windows,厌倦了杀毒软件,厌倦了盗版软件,所以决定换Linux。在换Linux的过程中,不能说没有问题,但基本是一帆风顺的,所以计划写本文。

How to learn Linux?

说实话,我学Linux(Ubuntu)并不久,不敢妄言怎么去学Linux,只是分享下我是怎么学Linux的。

No VMs

不要用虚拟机,也不建议刚装Linux,在Linux下装虚拟机装Windows。虚拟机的性能会大打折扣,虚拟机下优盘挂载、共享文件、屏幕大小等也不是一开始就合适的,所以不建议使用虚拟机。

Ubuntu支持wubi.exe,但我推荐最好是全新安装,安装一个系统最好,双系统也还好。

Habit

不要说什么不习惯,我想说和Windows不一样就对了,本身就不是Windows。声明下,不要提到Linux就是命令行,图形界面已经很成熟了。Linux下可以说没有不能改的,同时Linux发行版众多,和Windows习惯相同的也是有的。

Install

我推荐全新安装Linux,但是安装盘有时候并不是那么好制作,Windows下有名的工具UltraISO,并不能制作可用的Ubuntu启动U盘。不过制作好的Linux LiveCD功能可是相当强大的,Windows下工具也是有的:UNetbootin && Live USB Creator

看到这里,我建议有机会搞个LiveCD启动下玩玩。(注意备份资料,误操作全新安装会丢失硬盘数据),进入Linux后很多安装都是图形化的(如Ubuntu,SUSE,Debaian,Fedora,LinuxMint…),保留以前系统的,务必选择高级,自定义分区,不会破坏现有系统和引导的。

Guide

学习Linux,最好有本书作为指导,指导方向。版本选择可以选和书一致的,不过新几个版本也没有问题。建议:用长期支持的稳定版本!

SoftWare

软件安装尽量直接用软件中心的图形话界面,初学请避免编译安装。编译安装很好很强大,但是有不少人死在了无尽的编译中。

Linux下软件很丰富,可是你用的不一定有,有些游戏真的不能玩,但是Linux下有游戏,有不少游戏。举个例子,迅雷没有,可是同类的下载软件有一堆…

QQ

很多没有QQ就活不了的,我想说:你想用的QQ真不怎么有,虽说Linux下有解决方案,可是问题不是Linux,问题是永远不会是第一腾讯!!!

Linux下最直接的是WebQQ, 然后是Pidgin+lwqq插件,然后还有Wine和收费版的Wine:CrossOver

总结

想学Linux的就勇敢去学,失败的人总是在找借口,成功的人总是在找方法。

git_rename

Why

项目多了,难免会有重命名的时候,重命名本身没什么问题,可是加上gitignore中的*.pyc*~可能会出现些问题…

Q

重命名的时候一般不会有问题,可是在分支切换的同时,由于存在ignore的文件,分支的切换并不会那么正确。
往往会多出重命名前或重命名后的文件夹,多的原因就是文件夹下有被忽略的临时文件。

原因很简单,所以解决也不难,删除多余的文件夹,一切正常了。

总结

git在重命名文件夹后切换分支可能由于ignore临时文件的存在多出重命名前后的文件夹。

slice

“不会slice,绝不能说会python”,slice的重要性不言而喻。

Basis

  • index start with 0
  • support negtive index
  • [included:excluded:step] eg: [:], [::-1]
  • work with list, tuple and string

step

Ipython 中的示例
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
In [1]: e = range(6)

In [2]: e
Out[2]: [0, 1, 2, 3, 4, 5]

In [3]: e[:]
Out[3]: [0, 1, 2, 3, 4, 5]

In [4]: e[6]
IndexError

In [5]: e[5]
Out[5]: 5

In [6]: e[:5]
Out[6]: [0, 1, 2, 3, 4]

In [7]: e[:6]
Out[7]: [0, 1, 2, 3, 4, 5]

In [8]: e[::-1]
Out[8]: [5, 4, 3, 2, 1, 0]

In [9]: e[6:0]
Out[9]: []

In [10]: e[6:0:-1]
Out[10]: [5, 4, 3, 2, 1]

In [11]: 0 in e[6:0:-1]
Out[11]: False

In [12]: e[5:0:-1]
Out[12]: [5, 4, 3, 2, 1]

In [13]: e[5:0:-1] == e[6:0:-1]
Out[13]: True

In [14]: e[-1:-7:-1]
Out[14]: [5, 4, 3, 2, 1, 0]

In [15]: e[-1:-7:-1] == e[::-1]
Out[15]: True

In [16]: e[-1:-9:-1]
Out[16]: [5, 4, 3, 2, 1, 0]

In [17]: e[::-2] == e[-1:-7:-2]
Out[17]: True

In [18]: e[::-2] == e[-1:-8:-2]
Out[18]: 'Just do IT'
  • e[::-1] == e[-1:-7:-1]
  • slice切片中索引可以超出实际范围
  • 带有步长的切片,索引顺序和步长方向一致
  • 切片总是新产生一个对象,而不是改变原有对象

总结

Just do IT