shadowsocsR+privoxy liunx下使用SSR全局代理

前言

因为这段时间要去学校机房做实验,然后学校机房的网络可能经过了过滤,大陆外的ip一律无法访问,我们在机房用的系统是Ubuntu17.04,我直接用手机usb直接分享网络给机器使用(本来我还以为要使用复杂的网络设置,没想到现在的系统这么高级直接插上就可以使用了)。。但是我们还需要在liunx系统上进行外网访问,然后我测试了很多方法,比如以前的ss-Qt5,electron-ssr之类的GUI软件,但是都不行,后来有dalao指点,使用shadowsocksR-libv或者shadowsocksR-Python版加privoxy进行全局代理,然后我想了下,就试试吧,折腾了一晚终于完成了。

最后的shadowsocksR-libv的版本是2.6.3

配置

因为破娃妹子已经把源项目全部rm了,我们需要去shadowsocksR-backup里找到备份shadowsocksr-libev,然后git clone或者直接下载回到本地。

我们可以来到文档处,因为我们是ubuntu系统我就进入ubuntu的配置

输入命令

1
2
3
4
5
6
$ cd shadowsocks-libev
$ sudo apt-get install --no-install-recommends build-essential autoconf libtool libssl-dev \
gawk debhelper dh-systemd init-system-helpers pkg-config asciidoc xmlto apg libpcre3-dev
$ dpkg-buildpackage -b -us -uc -i
$ cd ..
$ sudo dpkg -i shadowsocks-libev*.deb

最后的shadowsocks-libev*.deb是最后打包好的deb包,输入打包出来的文件名。

然后终极大坑来了

我们使用命令ss-local使用代理。

1
$ ss-local -o [obfs混淆协议] -O [protocol协议] -g [obfsparam混淆参数] -s [服务器地址] -p [服务器端口] -l [本地监听端口] -b [本地监听地址] -k [SS密码] -m [加密方式]

记住所有选项的顺序一定要按照以上顺序输入

有个巨坑,我在测试的时候发现重启一次电脑之后,ss-local就没有混淆协议的选项了!!!!如果你使用-O、-g,ss-local会报错没有该参数,后来我转移到另外一台ubuntu虚拟机又可以使用了,坑死。。。。推荐如果出现错误,直接把shadowsocksR-libev删除掉,重新安装包。

然后我们安装privoxy

1
$ sudo apt-get install privoxy

安装完成之后,我们进入/etc/orivoxy更改config,把这句注释掉:

1
# listen-address localhost:8118

然后在最后一行加上:

1
2
forward-socks5 / 127.0.0.1:1080 .
listen-address 127.0.0.1:8118

记住第一行后面有一个.,我配置的时候没有记得加.,然后一直不行吓死我了。

然后我们配置全局的http proxy, sudo vim /etc/environment,加入下面的代码

1
2
export http_proxy=http://127.0.0.1:8118
export https_proxy=http://127.0.0.1:8118

然后我们重启计算机,重新来一次ss-local连上代理,使用curl www.google.com试试

大功告成。

flask+uwsgi+nginx的部署

前言

哇,之前写一个flask项目的时候,一直打算部署,看了不少的教程,最后选择了flask+uwsgi+nginx的搭配,然后在Ubuntu server里尝试上线,但是就是不行,一直报错502,一直找不到问题所在,后来在家里的一台烂liunx笔记本尝试上线(一样是Ubuntu),这已经距离我的flask项目写好过了几个月了,然后一次就成功了,一脸蒙蔽,这个教程并没有太多的对于uwsginginx的性能优化之类的,仅仅保留了最基本的配置。不会对配置做过多的解释,如果想知道配置文件的解释,可以自己谷歌或者百度查看uwsginginx的配置文件解释。仅仅做一个备忘录。

配置

nginx配置

nginx配置文件路径在/etc/nginx

nginx配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
server{
listen 80;
server_name localhost;
charset utf-8;
keepalive_timeout 0;
client_max_body_size 75M;
location / {
include uwsgi_params;
uwsgi_pass unix:/home/su/upload_file-master/demo.sock;

}

}

server_name为服务器地址,这里因为是本地上线,所以填了本地的地址,这里一个很主要的和uwsgi交互的地方在与uwsgi_pass这个配置选项,链接uwsgi的socket地址,生成这个socket的路径会在uwsgi的配置文件里配置。可以看下面的uwsgi配置。

这个文件的名字是nginx.conf,尽量不要修改,我们将这个文件放在/etc/nginx/site-enabled/里,然后修改一下/etc/nginx/nginx.conf里的include /etc/nginx/sites-enabled/*.conf这一项。

nginx.conf

然后我们检查一下nginx的配置文件正确性,输入命令sudo nginx -t,如果显示:

nginx-config

就表示nginx配置文件配置正确

uwsgi 配置

建议将uwsgi配置文件放在项目根目录下,后缀为.ini

uwsgi配置

1
2
3
4
5
6
7
8
9
10
[uwsgi]
processes = 8

wsgi-file = /home/su/upload_file-master/demo.py

socket = /home/su/upload_file-master/demo.sock

chmod-socket = 666
module = demo
callable = app

wsgi.file文件为flask的服务器入口,比如哪个文件有像这样的app.run(debug=True, port=9090, host="0.0.0.0")(其实就是服务器启动),socket的保存路径就是nginx配置文件中uwsgi_pass的路径,这个路径一定要对。chomd-socketsocket的权限改写成所有人可写可读。

callable选项为flask中的app = Flask(__name__)

win下的Clion配置

运行环境配置

我们需要mingwCmake,这个是clion需要的运行环境

mingw安装

百度mingw,然后点击download/installer,就会自动跳转到下载页面,然后安装,点击之后,一路continue,有个安装路径自己选择一下,如果选择其他路径,可以先创建一个空文件夹再选择其安装。

然后会出现下载安装器的界面,安装完成之后继续按continue退出。
mingw

然后会跳转到这个界面
mingw

我们在要安装的选项右键之后点击Make for Intallation,然后选择以下的选项:
mingw

然后安装,在左上的Installation选项卡里选择,Apply Changes,就可以安装成功了

Cmake安装

我们在官网找到安装页面Download

找到cmake 3.8.2的下载的地方,(其他的版本clion不认我也不知道为什么),选择适合自己系统的版本下载,我们是windows,就选择windows的下载好了。

然后一路安装就OK了

React学习纪录

开始React的世界

配置React

首先我们要安装Node.js环境,然后有npm安装环境,然后我们在命令行里执行

1
$ npm install create-react-app

然后我们就会有一个React脚手架,可以迅速构建React开发环境

1
2
3
4
$ npm install -g create-react-app
$ create-react-app my-app
$ cd myapp/
$ npm start

因为npm在国内很慢。。推荐在第一次创建项目的时候挂个科学上网什么的

然后我们会看到我们的第一个demo

Material-UI 使用教程

我们在当前项目的package.json中修改:

1
2
3
4
5
6
"dependencies": {
"material-ui": "^0.19.1",
"react": "^15.6.1",
"react-dom": "^15.6.1",
"react-scripts": "1.0.13"
},

material-ui添加进来,然后执行npm update --scripts-prepend-node-path=auto,将material-ui包添加进当前脚手架

然后我们开始构建第一个demo。

七牛云API工具使用

qshell的使用

qshell安装

在这里下载

qshell下载链接

选择自己平台的文件下载:

如果在使用的时候,报错Permission Denied,可以使用命令chmod +x qshell添加执行权限。
如果是liunx或者osx用户,可以添加PATH来直接启动

添加或者显示当前用户的AccessKey和SecretKey

秘钥可以在个人中心查看

命令格式qshell account [AccessKey] [SecretKey]

上传文件

命令格式 qshell fput [空间名] [空间文件名] [文件路径]

图解TCP/IP读书纪录

第一章

1. 3 协议

简单来说,协议就是计算机与计算机之间通过网络实现通信时事先达成的一种约定,这种约定可以使不同的设备之间进行通信,协议不同,就无法通信,两台计算机之间必须能够支持相同的协议,并遵守相同协议进行处理,这样才能进行相互通信

我们可以将人与人之间的对话比作协议,比如两个人必须都会英语才能正常交谈,如果一个人会日语,一个会英语,这样子是无法进行正常交谈的

我们可以将平常生活的对话做一个比较

  • 将日语、英语比作协议

  • 将聊天作为通信

  • 将说话的内容比作数据

1. 3. 5 分组交换协议

分组交换是指将大数据分割成一个个叫做包(Packet)的较小单位进行传输的方法。这里说的包,就像我们平常在邮局里面见到的邮包

平常我们在邮寄包裹的时候,通常会有一个寄件人和收件人的详细地址,计算机通信也会有一个类似的,在每一个分组中附加上源主机地址和目标主机地址送给通信线路。加上分组序号,这些我们通常称为报文首部

通信协议中通常会规定报文首部应该写入哪些信息、应该如何处理这些信息。

1. 5 协议分层与OSI参考模型

1. 5. 1 协议的分层

在这个分层模型中,每个分层都为接收下一层的特定服务,并且负责为自己的上一层提供特定的服务

上下层之间进行交互时所遵循的约定叫接口。同一层进行的交互遵循的是协议

1. 5. 3 OSI参考模型

OSI模型及参考作用:

  • 应用层 为应用程序提供服务并规定应用程序中通信相关的细节。比如邮件,文件传输

  • 表示层 将应用处理的信息转换成适合网络传输的格式,因此它主要负责数据格式的转换。

  • 会话层 通信记录

  • 传输层 管理两个节点之间的数据传输

  • 网络层 地址管理与路由选择

  • 数据链路层 互连设备之间传送和识别数据帧

  • 物理层 ‘0’’1’代表电压的高低、灯光的闪灭。界定连接器和网线的规格

1. 9 网络的构成要素

设备 作用
网卡 使计算机联网的设备
中继器(Repeater) 从物理层上延长网络的设备
网桥(Bridge)/2层交换机 从数据链路层上延长网络的设备
路由器(Router)3层交换机 通过网络层转发分组数据的设备
4~7层交换机 处理传输层以上各层网络传输的设备
网关(Gateway) 转换协议的设备

mongodb备忘录


在monogo shell的命令使用

连接数据库

本地数据库链接,默认的路径是/data/db/,可以使用--dbpath来指定数据库路径

1
$ sudo mongod --path ~/Desktop/db/

创建数据库

语法:use DATABASE_NAME

也有切换数据库操作的意思

1
2
3
4
> use runoob
switched to db runoob
> db
runoob

查看全部数据库

1
2
3
4
> show dbs
dmin 0.000GB
local 0.000GB
runoob 0.000GB

删除数据库

语法:db.dropDatabase()

1
2
> db.dropDatabase()
{ "dropped" : "runoob", "ok" : 1 }

创建集合

语法:db.createCollection(name,option)

options参数,类型是Document,可选有字段capped, autoIndexId,size,max

1
> db.createCollection("firstcollection")

带有option参数的:

1
> db.createCollection("firstcollection",{capped:ture})

一般情况下不用主动创建集合,插入文档的参数中有collection_name

删除数据库中的一个集合

语法:db.collection.drop()

比如切换到runoob数据库删除里面的一个site集合

1
2
3
4
5
6
7
8
> use runoob
switched to db runoob
> show tables
site
> db.site.drop()
true
> show tables
>

插入文档

Mongodb文档的数据结构和json基本一样,所有的数据都是BSON(存储在集合中的)

语法:db.COLLECTION_NAME.insert(document)

更新文档

update()save()方法来更新集合中的文档

语法格式如下:

1
2
3
4
5
6
7
8
9
10
> db.collection.update(
<query>,
<update>,
{
upsert:<boolean>,
multi:<boolean>,
writeConcern:<document>
}

)

参数说明:

  • query : update的查询条件,类似sql update查询内where后面的。

  • update : update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的

  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。

  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。

比如我们在runoob插入文档

1
> db.runoob.insert({title:'MongiDB',description:"Nosql"})

然后我们通过update()来更新标题

1
> db.runoob.update({'title':'MongoDB'},{$set:{'title':'Mongo'}})

以上的语句只会更新找到的第一个文档,如果你要更新多个同样的文档,你需要把multi参数打开

1
> db.runoob.update({'title':'MongoDB'},{$set:{'title':'Mongo'},{multi:ture}})

接下来我们使用save()来更新文档,save()方法通过传递的文档来替换已有文档。

语法格式如下:

1
2
3
4
5
6
db.collection.save(
<document>,
{
writeConcern:<document>
}
)

比如我们替换了_id为599ea3130a0004f919342ea5的文档数据

1
> db.runoob.save({"_id":ObjectId("599ea3130a0004f919342ea5"), "name":"kinoko3"})

MongoEngine使用

定义一个文档

1
2
3
4
5
6
7
8
9
10
from mongoengine import *  

import datetime


class Page(Document):

title = StringField(max_length=200, required=True)

date_modified = DateTimeField(default=datetime.datetime.now)

保存到数据库

1
2
3
4
5
6
7
8
if __name__ == '__main__':
# 第一种保存方法
page = Page()
page.title = "Hatsune Miku"
page.save()
# 第二种保存方法
page_1 = Page(title="Hatsune Miku")
page_1.save()

保存之后mongoenine将会创建一个新的以class名命名的集合,比如class Page(Document)的一个类,创建的集合将会是page,查看创建的集合可以在mongodb shell里使用命令show tables或者show collections查看

动态文档(DynamicDocument)

动态文档可以在保存数据的时候给数据自定不同的字段
比如:

1
2
3
4
5
6
7
class Page(DynamicDocument):
title = StringField(max_length=200)

if __name__ == '__main__':
page = Page(title='Hatsune Miku')
page.tags = ['mongodb', 'mongoengine']
page.save()

page.tags就是重新在这个文档里插入一个新的字段数据,在保存的时候,这个字段是之前没有在文档类里声明的,如果你不继承动态文档,直接在保存的时候添加字段,运行的时候不会报错,但是新加入的字段不会保存.上面的文档在mongodb shell中显示:

1
2
3
4
5
6
7
8
9
> {
"_id" : ObjectId("59a2b15c6f1d6513f3401668"),
"name" : "Hatsune Miku",
"tags" : [
"mongodb",
"mongoengine"
]
}
>

tags字段是我们后来添加的。

zsh终端折腾纪录①


安装zsh

  • 如果你是mac用户,系统已经自带有了,可以通过命令cat /etc/shells查看

  • 其他的liunx系统就从软件源安装就好了,Ubuntu,debianapt-get install zsh, centos,redhatyum apt-get zsh

安装oh-my-zsh

虽然zsh功能强大,但是配置复杂,如果你专研过算法导论编译原理可以自己写一套。。。。所以国外有大神写了一套配置oh-my-zsh

git clone安装方法:

克隆仓库

1
$ git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh

创建一个新的zsh配置文件

1
$ cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

改变默认的shell

1
$ chsh -s /bin/zsh

重新打开终端就好了

docker实践尝试


基础命令(频繁使用)

  • 查看镜像docker images
  • 构建镜像docker build -t

    -t是标签的意思,格式是<REPOSITORY > : <TAG>,如果你不创建这个,就会创建一个你FROM的镜像的默认名字,比如你在dockerfile指定FROM nginx,然后再docker build时候没有指定-t,你的这个镜像就会变成nginx:latest,你之前的nginx:latest就会变成nginx:<none>,所以构建的时候尽量指定-t.

  • 删除镜像 docker rmi,后面可以跟镜像名:TAG的格式,也可以用IMAGES ID.

  • 运行容器 docker run

    我们看到很多时候需要交互模式,其中-it是交互模式的参数

    如果我们需要后台运行,参数-d

    --name <容器名>如果不使用这条参数,docker将会自己分配容器名

  • 停止容器docker stop,删除容器docker rm

    查看在运行的容器docker ps

    查看所有的容器docker ps -aq

    查看所有新创建的容器docker ps -l

有时候我们需要一下子清理掉全部运行中的容器:

1
$ docker stop $(docker ps -q)

然后删除掉全部容器:

1
$ docker stop $(docker ps -aq)

一条命令实现:

1
$ docker stop $(docker ps -q) & docker rm $(docker ps -aq)

放一张图,docker command,(图出自原图链接

docker command

python知识备忘录


生成requirement文件

在当前目录生成requirements文件

1
$ pip freeze > requirements.txt

requirements安装库

1
$ pip install -r requirements.txt

pip安装时有一个不保留缓存的参数--no-cache-dir

找到site-packages文件夹

因为我用brew安装的python3,所以那个路径深似海啊,里面存放了我们的pip安装的一些第三方库

我们可以在python交互模式里面输入

1
import site; site.getsitepackages()

就出来路径了

|