心情

游戏用于寻求快乐,虽然都是不认识的人,还是能看出情商高低……

也许最理想的方式是不需要交流,一个人也可以玩的游戏。

第二阶段PVE任务也是有必要的。

小结

swagger 学习用时2天,天宫一号预计在2018年03月31日到2018年04月01日坠落地球,碎片坠落地点未知。

天宫一号的坠落,可以说我朝近年的航天成果全灭。

报道断章取义…… 陨落只是时间问题。小额外汇貌似限制了,实际未测试。

使用DarkaOnLine/L5-Swagger可以在代码中以注释形势直接编写API文档非常方便。

注释中的语法要使用Swagger-php样式,SWAGGER VERSION 3.0

DarkaOnLine/L5-Swagger安装

项目使用的是laravel 5.5 对应 darkaonline/l5-swagger:5.5.*

1
composer require "darkaonline/l5-swagger:5.5.*"

复制设置与视图文件

1
php artisan vendor:publish --provider "L5Swagger\L5SwaggerServiceProvider"

SWAGGER VERSION 3.0支持

1
composer require "zircote/swagger-php:3.x-dev"

设置.env文件

L5_SWAGGER_GENERATE_ALWAYS=true为每次打开页面是都进行重新渲染,设计阶段非常好用。

1
2
SWAGGER_VERSION=3.0
L5_SWAGGER_GENERATE_ALWAYS=true

基础文件设置

基本用法

swagger-v3.php

用于设置一些基本API信息,在页面最上方显示。

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
/**
* @OAS\OpenApi(
* @OAS\Info(
* version="1.0.0",
* title="Test Api",
* description="描述",
* termsOfService="https://Test.dev/terms/",
* @OAS\contact(
* email="test@test.dev",
* name="test",
* url="https://test.dev"
* ),
* @OAS\License(
* name="Apache 2.0",
* url="http://www.apache.org/licenses/LICENSE-2.0.html"
* )
* ),
* @OAS\Server(
* description="OpenApi host",
* url="https://test.dev/api"
* ),
* @OAS\Server(
* description="OpenApi host",
* url="https://test.dev/api/v2"
* ),
* @OAS\ExternalDocumentation(
* description="OpenApi host",
* url="https://test.dev/api/Doc"
* )
* )
*/

@OAS 为使用前缀,用于读取swagger的设置

名头 解释 是否必要 其他说明
OpenApi swagger 初始化 必要 唯一并位于全部设置最顶端
Info Api说明 必要 设置中的titleversion为必要项
Server Api 前置路径 非必要 多连接时,可以并行设置
ExternalDocumentation 扩展文档 非必要 只能设置descriptionurl
paths 连接地址 必要 可以在控制器位置设置
tags 主标签 必要 laravel一起使用时,独立设置方便管理。可以设置namedescriptionExternalDocumentation

tags.php

用于设置用户标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* @OAS\Tag(
* name="2fa",
* description="Google 2FA",
* @OAS\ExternalDocumentation(
* description="more",
* url="https://test.test/docs"
* )
* )
* @OAS\Tag(
* name="store",
* description="Access to Petstore orders"
* )
* @OAS\Tag(
* name="user",
* description="Operations about user"
* )
*/

path 部分

直接使用注释形势写入控制器

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/**
* @OAS\Get(
* path="/test", // API 路由地址
* tags={"test"}, // 对应Tag
* sumary="get test doc", // API概要
* description="get test doc more ........", // API描述
* operationId="test", // API请求时ID
* deprecated=false, // API是否有效
* @OAS\Server( // 独立API连接设置 可以覆盖全局
* description="Server host", // 连接描述
* url="https://test.dev/api" // 连接地址
* ),
* @OAS\Parameter( // API参数, 非必要
* name=”id“, // 参数名
* in="query", // 参数位置 可以设置`query`、`header`、`path`、`cookie`
* description="adout this id ......", // 描述
* required=true, // 是否必须填写,当in设置为path时,需要设置为true。
* style="from", // 设置参数序列化类型,非必要,自动根据in值设置。
* @OAS\Schema(
* type="string", // 参数类型
* example="test example", // 参数例子
* )
* ),
* @OAS\RequestBody( // 请求主体 content-type 下使用 适合传递多个参数
* description="adout this id ......", // 描述
* required=false, // 是否必须填写,默认为false
* @OAS\MediaType( // 请求数据结构
* mediaType="application/json", // application/json 结构
* @OAS\Schema(
* type="string"
* ref="#/components/schemas/User" // 可以载入设置完成的参数,区分大小写
* ),
* @OAS\Schema(
* @OAS\Property( // 多参数设置
* property="otp", // 参数名称
* description="yubikey otp", // 参数描述
* type="string", // 参数类型
* example="cccccccccccccccccccccccccccccccccccccccccccc"
* // 参数例子
* )
* )
* ),
* @OAS\MediaType( // 请求数据结构
* mediaType="application/xml", // application/xml 结构
* @OAS\Schema(
* type="string"
* ref="#/components/schemas/User" // 可以载入设置完成的参数,区分大小写
* ),
* @OAS\Schema(
* @OAS\Property( // 多参数设置
* property="otp", // 参数名称
* description="yubikey otp", // 参数描述
* type="string", // 参数类型
* example="cccccccccccccccccccccccccccccccccccccccccccc"
* // 参数例子
* )
* )
* )
* ),
* @OAS\Response( // 响应,必须设置
* response=200, // 响应编号
* description="successful operation", // 响应描述
* @OAS\Header(
* header="X-Rate-Limit", // 响应头
* description="calls per hour allowed by the user",
* // 响应头描述
* @OAS\Schema(
* type="integer",
* format="int32",
* default="64", // 默认
* example="12" // 例子
* )
* ),
* @OAS\MediaType( // 响应数据结构
* mediaType="application/json",
* @OAS\Schema(
* @OAS\Property(
* property="message", // 响应参数头
* description="Response message",
* type="string", // 响应参数数据类型
* example="true" // 响应参数例子
* )
* ),
* )
* )
* )
*/

Model 数据参数

可以直接设置在class之上,使用ref="#/components/schemas/ClassName"可以直接引用。

swagger默认载入位置#/components/schemas/

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
/**
* @OAS\Schema(
* title="yubikey model",
* description="yubikey model",
* type="object",
* @OAS\Property(
* property="message",
* description="Response message",
* type="string",
* default="true",
* example="true"
* ),
* @OAS\Property(
* property="status",
* description="Updated status",
* type="string",
* example="true"
* ),
* @OAS\Property(
* property="age",
* description="Updated status of the pet",
* type="integer",
* minimum="0"
* ),
* )
*/

bitbeans/yubikey 的坑

控制器中不能正常获取Exception。所以不能使用下方代码

1
2
3
4
5
6
7
8
9
use YubiKey;

try {
$yubikey_auth = Yubikey::verify(Input::get('otp'));
$yubikey_params = Yubikey::getParameters();
$yubikey_identity = Yubikey::getParameter('identity');
} catch (\Exception $exception) {
$error = $exception->getMessage();
}

改写到App\Exceptions\Handlerrender方法判断,使用Exception判断的packages不多。

1
2
3
4
5
6
switch($exception->getMessage()) {
case 'REPLAYED_OTP':
return response()->json(['message' => $exception->getMessage()]);
case 'Could not parse Yubikey OTP':
return response()->json(['message' => $exception->getMessage()]);
}

以上

心情

一场一定会输的战争……

百姓要苦了……

steam api 访问不能

唯一的希望就是上线后离开

今天关掉了一直关注的人 动力吗 曾经是吧

永远没有回复的留言 不如不看

制造人偶的心情+1

以上

心情

宫墙深厚,近日又动刀字幕组,一如既往的套路……

最近迷上了摇曳露营,抚子好萌。

同款 迷你净财箱B-6君

amazon

71iIrWcGmvL._SL1400_

同款 帐篷ムーンライトテント3型

k_1122288_iv

巡礼路线

参考网址

心仪之物

heimplanet帐篷

Fistral 2.5KG 充气帐篷 总之打气就好~~

ムーンライトテント3型 是3.8KG

fistral-cairo-camo_1

THE CAVE 5.2KG 充气帐篷 防水性比Fistral好,空间也大。

the-cave-cairo-camo_1

YPJ-TC

yamaha 新款电动自行车 想入呢 2018年6月11日上市
index_bike

以上

小记

ssrtls被爆,大规模封禁来袭,转v2ray

直接部署非常容易,使用docker快速部署是正解,

实现websocket+tls+V2ray+Nginx+CDN

起因,2018年2月15日开始梯子出现故障,换之。

2018年2月25日 戊戌复辟,可笑至极,诸多词变为禁语。包括张勋袁世凯等等。微博、微信,禁止修改头像,签名。反对等不能发表。

马前课 第十一课 开始了……

2月26日开始研究部署v2ray相关,其中遇坑,记录如下,供后人参考。

原理

v2ray 使用websocket连接到CDN,对抗DNS污染,保护真实IP

CDN连接在到服务器,全程通讯使用tls加密。【不是仿造,是真正的TLS】,服务器内部转发到v2ray容器。

Q:为什么使用docker而不是直接部署?
A:不方便转移到其他服务器。同时不容易弄乱服务器环境
Q:docker好处是什么
A:不需要手动更新证书,可以使用二级域名部署其他服务。比如webmail等等。可以随时添加。

docker

大多数供应商都支持docker快速构建,直接选择即可。服务器多为ubuntu

更新各种包后,准备开始工作。

更新命令

1
2
$ apt update
$ apt upgrade

文件目录

1
2
3
4
5
|-- docker-compose.yml
|-- v2ray
| `-- config.json
`-- vhost.d
`-- ******_location

docker-compose.yml

说明:

v2ray下的VIRTUAL_HOST注意填写为二级域名,也可以去掉不填。

同样v2ray下的exposeVIRTUAL_PORT为端口号,应该与*****_location中端口一致。


web1为一般web服务器,开放端口80
You_Domain_Name 改为你的域名
You_Email 为邮箱,必填

  • VIRTUAL_HOST=You_Domain_Name
  • VIRTUAL_PORT=80
  • LETSENCRYPT_HOST=You_Domain_Name
  • LETSENCRYPT_EMAIL=You_Email

nginx-proxy如名字,详情自行google
letsencrypt-nginx-proxy-companion如名字,详情自行google


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
version: '2'

services:
v2ray:
image: v2ray/official
container_name: v2ray
restart: always
expose:
- "****"
volumes:
- $PWD/v2ray:/etc/v2ray
- $PWD/v2ray/config.json:/etc/v2ray/config.json:ro
environment:
- VIRTUAL_HOST=****
- VIRTUAL_PORT=****

web1:
image: nginx:latest
restart: always
expose:
- "80"
environment:
- VIRTUAL_HOST=*****
- VIRTUAL_PORT=80
- LETSENCRYPT_HOST=*****.***
- LETSENCRYPT_EMAIL=*****@*****.***

nginx-proxy:
image: jwilder/nginx-proxy:latest
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- /path/to/certs:/etc/nginx/certs:ro
- $PWD/vhost.d:/etc/nginx/vhost.d:ro
- /usr/share/nginx/html
- /var/run/docker.sock:/tmp/docker.sock:ro
labels:
- "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"

letsencrypt-nginx-proxy-companion:
image: jrcs/letsencrypt-nginx-proxy-companion:latest
restart: always
volumes:
- /path/to/certs:/etc/nginx/certs:rw
- $PWD/vhost.d:/etc/nginx/vhost.d:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
volumes_from:
- nginx-proxy

TLS转发

dockec-compose.yml下创建vhost.d文件件,

新建文件You_Domain_Name_location

使用你的域名替换You_Domain_Name,要与web1设置的一致。

注意proxy_pass后的端口与v2ray设置的一致。

1
2
3
4
5
6
7
8
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
if ($http_upgrade = "websocket" ) {
proxy_pass http://v2ray:****;
}

v2ray 设置文件config.json

dockec-compose.yml下创建v2ray文件件,

新建文件config.json

port注意与v2ray设置一致

id改为你的id,可以使用uuidgenerator生成一个。

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
{
"inbound": {
"port": "****",
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "***********",
"alterId": 64
}
]
},
"streamSettings": {
"network": "ws",
"wsSettings": {
"path": "/"
}
}
},
"outbound": {
"protocol": "freedom",
"settings": {}
}
}

之后

去用户端里面设置吧。地址You_Domain_Name端口443,记得使用websocketTLS

CDN

CloudFlare

DNS中开启websocket

CryptoRequire Modern TLS关闭

CryptoAuthenticated Origin Pulls关闭

CryptoOpportunistic Encryption关闭

nginx-proxy 的坑

nginx-proxy中,设置转发时www.www.com/path无法正常解析,这个问题3年没有修复过了……

错误重现:vhost.d下,新建www.www.com设置

1
2
3
4
5
6
7
8
9
10
location /v2ray/ {
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
if ($http_upgrade = "websocket" ) {
proxy_pass http://v2ray:****;
}
}

于是只能使用www.www.com_location进行转发。

参考文档

v2ray

参考1

参考2

小记

网络崩溃变成了日常,每天维护网络正常2小时,每次走ufw速度比直连慢一倍。

天上乌云密布,光又在何处。

完蛋,很恶心。

小记

quasar-cli升级到了0.15.1 与之前版本不兼容……

不支持quasar-play

目录结构有所调整,比之前清晰多了,加上一次编程构建PWACordovaElectron全平台大礼包。

和预想的一样,android就是坑多。

安装 JAVA 8

Android Studio依然不好下载。墙!墙!墙! 略烦。

需要java……,直接使用brew cask install java安装是9.0+版本,不兼容Cordova需要装java8,方法如下

1
2
brew tap caskroom/versions
brew cask install java8

使用/usr/libexec/java_home -V查看本机安装的JDK

安装jenv用于管理与切换java版本brew install jenv

1
2
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(jenv init -)"' >> ~/.zshrc
1
2
3
jenv add /Library/Java/JavaVirtualMachines/jdk-9.0.4.jdk/Contents/Home
jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home
jenv global 1.8.0.162

需要重启使用java -version检查设置

其他设置方法。

1
2
jenv local 1.8.0.162
jenv shell 1.8.0.162

安装 Android Studio

1
brew cask install android-studio

之后还是要等……

zshrc

编辑~/.zshrc,并添加下方代码

1
2
3
export ANDROID_HOME="$HOME/Library/Android/sdk"
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools

Cordova 构建需要 gradle

1
brew install gradle

心情

真让人恶心,自己什么都不做,却幻想着得到巨额的回报。

不觉得中彩票的几率更大吗。

满心的小算盘,当别人看不出来吗。

想如愿,呵呵,等着去吧。管你是谁,都别做梦了。

现在心情与吃了苍蝇差不多。

汪年快乐

汪年快乐。

除夕夜服务器被墙也是神了。

总之,要加油了~~

以上。

许愿望吧

顺利完成,如愿逃离。

0%