Using special SSH key for Git
In ~/.ssh/config
:
host github.com
HostName github.com
IdentityFile ~/.ssh/id_rsa_github
User git
don’t forget chmod 600 ~/.ssh/config
Or, use GIT_SSH_COMMAND
environment variable:
export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null"
Regex Unicode Scripts
\p{Han}
匹配中文、日语文字,支持简繁体。\p{Common}
匹配符号\p{Latin}
匹配拉丁语系- 需要 grep perl 支持,即
grep -P "\p{Han}"
,或者rg/ag
.
echo '中文/繁體/片仮名/かたかな/カタカナ/katakana' | rg "\p{Han}" > 中文 繁體 片仮名
echo '中文@mail.com' | rg "\p{Common}" > @ .
echo '中文@mail.com' | rg "\p{Latin}" > mail com
Unicode Scripts for more.
Octotree for Safari
From Safari 13, you can only install extension from Mac App Store.
brew install node@10
export PATH="/usr/local/opt/node@10/bin:$PATH"
# make sure node and npm is v10, cause octotree used gulp 3, which is not working with node 12.
git clone https://github.com/ovity/octotree.git ~/src/octotree
cd ~/src/octotree
git checkout master
npm i
npm install [email protected]
npm run dist
# extension locate in ~/src/octotree/tmp/safari/octotree.safariextension/
cd ~/Library/Safari/Extensions
mv ~/src/octotree/tmp/safari/octotree.safariextension .
- Enable
Developer
menu in Safari Developer - Show Extension Builder
- Add octotree.safariextension and Run
MySQL Prefix Index
CREATE TABLE `t1` (
`bundle` varchar(300) DEFAULT '' COMMENT 'pkg name',
`domain` varchar(200) DEFAULT '',
UNIQUE KEY `idx_bundle_domain` (`bundle`(100),`domain`(100))
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4;
关键部分 bundle(100)
来解决组合索引可能会出现的 Specified key was too long; max key length is 767 bytes
错误。
Deployment with git
#!/bin/sh
set -uex
PATH=$PATH:$HOME/bin
export PATH
DIR=/home/serv/project
cd ${DIR}
REV1=$(git rev-parse --verify HEAD)
git pull origin master
REV2=$(git rev-parse --verify HEAD)
test ${REV1} = ${REV2} && echo "Already updated" && exit
make
test $? -ne 0 && echo "make error" && exit
kill -HUP $(cat logs/run.pid)
主要是通过 git rev-parse --verify HEAD
来获取当前 rev hash,前后对比是否一致,以此来决定是否继续。
logrotate
logrotate - rotates, compresses, and mails system logs
# 0 0 * * * /usr/sbin/logrotate --state=/home/serv/logrotate.state /home/serv/logrotate.log.conf
/home/serv/logs/dev.log
/home/serv/logs/access.log {
rotate 10
daily
compress
create
copytruncate
missingok
dateext
dateformat -%Y-%m-%d
dateyesterday
sharedscripts
postrotate
kill -USR1 `cat /var/run/nginx.pid`
endscript
}
- 要么保存到 /etc 配置,由系统调度。也可以自己通过 crontab 调度控制,这种情况要注意加
--state
来保存状态 - 像 nginx 可以通过
kill -USR1
来重新打开日志文件,如果服务不支持可以用copytruncate
,先拷贝再清空
Druid Query in JSON
Druid 可以在 Superset SQL 查询,除此之外可以通过 HTTP+JSON 查询:
curl -X POST '<host:<port>/druid/v2/?pretty' -H 'Content-Type:application/json' -H 'Accept:application/json' -d @query.json
{
"queryType": "timeseries",
"dataSource": "cpm_log",
"granularity": "hour",
"aggregations": [
{
"type": "longSum",
"name": "requests",
"fieldName": "req_count_raw"
},
{
"type": "longSum",
"name": "impressions",
"fieldName": "win_count"
},
{
"type": "floatSum",
"name": "revenues",
"fieldName": "win_price"
}
],
"postAggregations": [
{
"type":"arithmetic",
"name": "ecpm",
"fn": "/",
"fields": [
{
"type": "fieldAccess",
"name": "postAgg_rev",
"fieldName": "revenues"
},
{
"type": "fieldAccess",
"name": "postAgg_imps",
"fieldName": "impressions"
}
]
}
],
"filter": {
"type": "and",
"fields": [
{
"type": "selector",
"dimension": "device_os",
"value": "android"
},
{
"type": "in",
"dimension": "req_ad_type",
"values": ["banner"]
}
]
},
"context": {
"grandTotal": true
},
"intervals": [
"2019-04-09T00:00:00+08:00/2019-04-09T23:00:00+08:00"
]
}
- queryType 有
timeseries
,topN
,groupBy
,search
,timeBoundary
等 - 尽量少用 groupBy 查询,效率不高
- topN 查询是通过
metric
来排序 context
可以指定queryId
,这样可以通过DELETE /druid/v2/{queryId}
取消查询- 去重:
{"type": "cardinality", "name": "distinct_pid", "fields": ["ad_pid"]}
To Appwill
昨天梦到了 AW。
不是现在的 AW,是几年前的,很多人都还在,一起讨论某个产品。
那时的 AW 很小,但有凝聚力,有战斗力,很 nice。后来有好几个人都跟我说过,那时的 AW 是大家最棒的经历。
什么时候是个转折呢?大概就是 15年吧,Z 移民澳洲后产品上一直没有太好的 Lead,之后日活下降收入走低,产品开始往下走。16年后 L 对现有产品兴趣不大,改组内部项目制,效果也不好。
再后来,17年初 L 组建新公司,Z&Z 言明不可从原公司挖人,结果就是一起拼搏走过来的人,跟着已经死去的旧产品沉没,之后相继离职,包括我。
我个人对 AW 的感情很深,但说实话,最后创始人分家+限制挖人,让我心里很不舒服,本身我们还可以一起用彼此都信任的方式做事,结果却似有欺骗,维护着注定要死去的产品,费劲心力,却无成长。
R.I.P.
Nginx proxy_next_upstream non_idempotent
在 Nginx 做反向代理的时候,我们一般会配置 proxy_next_upstream
,如果某个 upstream 超时或出错,自动切换到下一个 upstram。
upstream backend{
server 192.168.0.1;
server 192.168.0.2;
}
location /example/ {
proxy_pass http://backend;
proxy_next_upstream error timeout http_500 non_idempotent;
}
这里有一个地方需要注意,non_idempotent
,Nginx 默认对 non-idempotent 请求,比如 POST/LOCK/PATCH,是不进行重试。常见的情况就是 POST 请求出错后不会重试,需要加上该设置。
normally, requests with a non-idempotent method (POST, LOCK, PATCH) are not passed to the next server if a request has been sent to an upstream server (1.9.13); enabling this option explicitly allows retrying such requests;
Homebrew Speedup
通过修改 Homebrew git repo 来加速:
cd "$(brew --repo)"
git remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git
// 中科大 git remote set-url origin https://mirrors.ustc.edu.cn/brew.git
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git
// 中科大 git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git
// homebrew-cask
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-cask"
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git
// homebrew-bottles
export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles
// export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles
// export HOMEBREW_BOTTLE_DOMAIN=http://7xkcej.dl1.z0.glb.clouddn.com
重置为官方源:
cd "$(brew --repo)"
git remote set-url origin https://github.com/Homebrew/brew.git
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://github.com/Homebrew/homebrew-core
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-cask"
git remote set-url origin https://github.com/Homebrew/homebrew-cask