爱情经典语录

让爱做主 - 离婚信

当我提起笔给你写这封信的时候,我只觉得,往事就像山谷间一条小溪,静静的从我心底流过,
他把我带回了过去,带回了我们的相知相恋的那个遥远年代,
当我回顾我们的婚姻的时候,我想起了以往岁月中,我们共同拥有的哪些美好时光,
想起了我们的第一次见面,第一次去看电影,想起了我们的初吻,也想了当年的我们蜜月旅行,这一切,仿佛就发生在昨天,
但是,他对于现在的你我来说,竟是那样的遥不可及,当我想起这一切的时候,
我觉得就像是看一场老电影,虽然很感人,但是却是很陌生,我眼看故事的主人公,一步一步的犯下了无法挽回的错误,
我看着他们将美好的感情,尘封在彼此心灵的角落里,就如同一朵鲜花,被人忘记到阁楼中,
当我看到故事的结尾,我遗憾的发现,这只能是个不了了之的结局;对于我给你带来的伤害,我由衷的道歉;是该结束我们两个人痛苦时候了,我想了很久,现在 我要告诉你我最后的决定,我同意离婚。

jenkins从机iOS环境部署

  1. 下载 Xcode
  2. 下载 java8
    https://www.oracle.com/java/technologies/downloads/
  3. git 账号和密码登录配置
    当前用户下.gitconfig
1
2
3
4
5
6
7
8
9
10
[user]
email = 328872015@qq.com
[credential]
helper = store
[color]
ui = auto
[core]
eol = lf
[url "https://"]
insteadOf = git://
1
2
3
.git-credentials

http://huang:********@10.168.66.55
  1. 按照 homebrew
1
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  1. 安装 rvm
1
2
curl -sSL https://get.rvm.io | bash -s stable
rvm install 3.1.2
  1. xcode-》偏好中,设置开发者账号

  2. 安装 cocoapod

1
sudo gem install cocoapods
  1. 安装 fastlane
1
brew install fastlane

nginx按照lua

1
2
brew tap denji/nginx;
brew install nginx-full --with-lua-module --with-set-misc-module

nginx打印post请求参数

nginx.conf

/usr/local/webserver/tengine/conf/nginx.conf

1
2
3
4
5
http {
log_format post_tag '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_body"';
}

service.**.com.conf

/usr/local/tengine-2.0.2/conf/vhosts.d/service.**.com.conf

1
2
3
4
5
6
7
8
9
location /newapi/ {
if ($content_type ~* "application/x-www-form-urlencoded") {
access_log /data/fund/logs/service.******.com_access.log post_tag;
}

rewrite ^/newapi/(.*)$ /$1 break;
proxy_pass http://newapi;

}

h5.**.com.conf

/usr/local/tengine-2.0.2/conf/vhosts.d/h5.**.com.conf

1
2
3
4
5
6
7
8
9
location /gxq/ {
if ($content_type ~* "application/x-www-form-urlencoded") {
access_log /data/fund/logs/h5.******.com_access.log post_tag;
}

rewrite ^/gxq/(.*)$ /$1 break;
proxy_pass http://newapi;

}

https://serverfault.com/questions/649151/nginx-location-regex-doesnt-work-with-proxy-pass/649196#649196

vscode里混合调试c++和nodejs

由于业务里涉及到 js 和 c++互相调用,为了调试方便,研究下如何在 vscode 里混合调试 c++和 js 代码。

c++开发和调试

在讲混合调试之前,先简单介绍下 vscode 下 c++的开发和调试,后续所有都是在 Mac OS 环境下操作的。

前置条件

安装 c++套件 c++ extension
安装 lldb 套件 vscode-lldb
确认安装 clang

混合调试

因为 c++和 nodejs 走的是不同的调试协议,因此很难通过一个 configuration 来调试两者。 我们以 node 官方的 example https://github.com/nodejs/node-addon-examples/tree/master/1_hello_world/nan, 看看如何进行混合调试

addon 编译

创建 addon 的编译 script

1
2
3
4
5
6
7
8
"scripts": {
"start": "node index.js",
"build:dev": "node-gyp -j 16 build --debug", // 编译带上debug信息
"build": "node-gyp -j 16 build",
"rebuild:dev": "node-gyp -j 16 rebuild --debug",
"rebuild": "node-gyp -j 16 rebuild",
"clean": "node-gyp clean"
},

创建 preLaunchTask

调试程序前,我们需要预先编译好可以 debug 的 addon,因此我们创建一个 preLaunchTask,选择 rebuild:dev,其负责编译一个可以 debug 的 addon 版本
img

创建 launch.json

我们新创建一个启动 node 的 launch,不过我们这里使用 lldb 来启动 node,配置如下

1
2
3
4
5
6
7
8
{
"type": "lldb",
"request": "launch",
"name": "lldb:node",
"program": "/Users/yj/.nvm/versions/node/v12.16.1/bin/node", // 指向node入科
"args": ["examples/addon/index.js"], // 指向js入口
"cwd": "${workspaceFolder}"
},

此时我们启动 lldb:node 就可以进入 node 的 addon 进行 debug

img

这里存在的问题在于,我们这里实际上是使用 lldb 来调试 node 程序(此时的 addon 实际上是一个动态库),lldb 实际上对 js 的调试是无感知的,因此我们这样实际是无法调试 js 的,在 js 里打下的断点也无法进入。

nodejs 调试

实际上 node 的 js 里的调试功能实际上是通过 chrome debugger protocol 协议来实现的,因此我们只需要启动 js 的时候,开启 inspector 协议就然后就可以 attach 到 js 上进行调试。 修改配置,开启 inspector 协议

1
2
3
4
5
6
7
8
{
"type": "lldb",
"request": "launch",
"name": "lldb:node",
"program": "/Users/yj/.nvm/versions/node/v12.16.1/bin/node",
"args": ["--inspect-brk","examples/addon/index.js"], // 开启inspector协议
"cwd": "${workspaceFolder}"
},

此时我们重新启动 lldb:node,发现在终端出来个 websocket 地址
img

在 vscode 里调试 js

实际上当 node 开启 inspector 协议的时候,不仅可以通过 ws attach 到 node 的 js 上,实际上也可以通过 http:port attach 到 js 上。实际上我们的 ws 地址也是从这个 http:port 获取来的 nodejs 在开启 inspect 的时候默认会启动一个 inspect server,其地址为 ​http:127.0.0.1:${inspect_port}​,其inspect_port默认为9229,当然也可以通过node --inspect-brk --port:${inspect_port}来指定其端口。 其暴露了一个接口 ​/json​,通过该接口即可获得其对应的 websocket 地址
img

下面我们来通过 vscode 来调试 js,首先创建一个 launch 任务,此时我们选择 Node.js: attach
img

我们选择通过 port 来 attach 到 js 上,配置如下

1
2
3
4
5
6
7
8
9
{
"type": "node",
"request": "attach",
"name": "node:attach",
"port": 9229, // 绑定到node.js默认的inspect的端口
"skipFiles": [
"<node_internals>/**"
]
},

此时我们只需要启动 lldb:node 启动调试,其会自动的停止在第一行 js 代码上。这样我们就实现了在 vscode 里混合调试 c++和 js

compound 模式

借助于 vscode 的 launch 的 compound 功能,我们甚至可以避免手动的切换 debugger,达到真正的一键调试,配置如下

1
2
3
4
5
6
"compounds": [
{
"name": "node_c++",
"configurations": ["lldb:node","node:attach"]
}
]

这样我们点击 node_c++功能就可以实现一键调试

pytorch库介绍

Pytorch autograd,backward 详解

https://zhuanlan.zhihu.com/p/83172023

Pytorch-view 的用法

https://zhuanlan.zhihu.com/p/87856193

pytorch 中 nn.Embedding 原理及使用

https://www.jianshu.com/p/63e7acc5e890

GRU 使用

https://zhuanlan.zhihu.com/p/37217734
https://www.jianshu.com/p/0c87b6ab0c4a

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
import torch.nn as nn
import torch

# gru = nn.GRU(input_size=50, hidden_size=50, batch_first=True)
# embed = nn.Embedding(3, 50)
# x = torch.LongTensor([[0, 1, 2]])
# x_embed = embed(x)
# out, hidden = gru(x_embed)


gru = nn.GRU(input_size=5, hidden_size=6,
num_layers=2, # gru层数
batch_first=False, # 默认参数 True:(batch, seq, feature) False:True:( seq,batch, feature),
bidirectional=False, # 默认参数
)

# N=batch size
# L=sequence length
# D=2 if bidirectional=True else 1
# Hin=input size
# Hout=outout size


input_ = torch.randn(1, 3, 5) # (L,N,hin)(序列长度,batch size大小,输入维度大小)
h0 = torch.randn(2 * 1, 3, 6) # (D∗num_layers,N,Hout)(是否双向乘以层数,batch size大小,输出维度大小)

output, hn = gru(input_, h0)
# output:[1, 3, 6] (L,N,D*Hout)=(1,3,1*6)
# hn:[2, 3, 6] (D*num_layers,N,Hout)(1*2,3,6)

print(output.shape, hn.shape)
# torch.Size([1, 3, 6]) torch.Size([2, 3, 6])

样例二
# 创建一个输入输入50维的GRU
gru = nn.GRU(input_size=50, hidden_size=50, batch_first=True)

# 创建一个字典大小为3,词向量维度为50维的Embedding。
embed = nn.Embedding(3, 50)

# 创建一个二维LongTensor索引数据(作为索引数据的时候一般都使用LongTensor)
x = torch.LongTensor([[0, 1, 2]]) # x.size() --> torch.Size([1, 3])

# 将索引映射到向量
x_embed = embed(x) # x_embed.size() --> torch.Size([1, 3, 50])

深度学习挑选变量

挑选变量的方法多种多样,可以用 IV、GBDT、随机逻辑回归、随机森林、逐步回归、cluster 等等(我在建模中实际用到)。