任何技能都是从模仿开始,逐步升华。
今天网上随便看东西的时候,看到一个名为【任何技能都是从模仿开始,逐步升华。】的博客。地址
以前想写一个 PHP 框架来练手,总是想着不能模仿别人的框架,要自己设计,但到最后总觉得差点什么,做出来的东西自己都不喜欢。
今天看到这句话,还是有点感触的。该模仿就模仿,该抄就抄,逐步升华。不是天才,不可能自己悟出来,只能借鉴前人的东西,借鉴多了,慢慢的也就有了自己的东西。
今天网上随便看东西的时候,看到一个名为【任何技能都是从模仿开始,逐步升华。】的博客。地址
以前想写一个 PHP 框架来练手,总是想着不能模仿别人的框架,要自己设计,但到最后总觉得差点什么,做出来的东西自己都不喜欢。
今天看到这句话,还是有点感触的。该模仿就模仿,该抄就抄,逐步升华。不是天才,不可能自己悟出来,只能借鉴前人的东西,借鉴多了,慢慢的也就有了自己的东西。
今天入职新公司,但是发现网络访问并不自由。。公司内的 WiFi 想要访问外网,要使用公司的内部代理,这就蛋疼了,shadowsocks 都用不了了。但是我发现 ssh 可以直连前几天买的日本服务器,经龙哥提醒,可以使用 ssh 来做代理从而突破限制。下面就是具体方法了。
其实命令很简单
通过 ssh -f -NT -D 127.0.0.1:7001 username@host
在本地开一个端口,然后使用 Proxy SwitchySharp (Chrome 扩展) 设置一个 socks5 代理即可(代理设置为 127.0.0.1:7001)。当然这个有一个前提就是,要把自己电脑的 public_key 放到远程服务器,不然要输入密码,体验就大打折扣了。
对各个参数的解释参考了这里,在此对博主表示感谢。
- -f 表示后台执行ssh指令
- -D 表示通过动态端口转发方式打开 ssh 通道
- -N 表示只连接远程主机,不打开远程shell
- -T 表示不为这个连接分配TTY
- -NT 两个参数可以放在一起用,代表这个SSH连接只用来传数据,不执行远程操作
虽然命令足够简单,但是作为一个懒惰的程序员,怎么可能做重复的事情,所以要写一个 alias 来简化它,直接贴代码。
# ssh proxy
alias jpproxy='ssh -f -NT -D 127.0.0.1:7001 username@host &> /dev/null'
alias jpproxystop="ps aux | grep username@host | grep -v grep | awk '{print \$2}' | xargs kill"
这是我用日本服务器搞的 ssh 代理。
第一个 alias 用来开启代理
第二个 alias 用来关闭代理,$xxx 在 shell 里代表变量,所以要用 \ 转义 $
至此我们已经成功翻过两堵高墙,来到了真正的互联网,顿时感觉整个人都自由了。
但是还有个问题,目前代理并不是全局的,之后要看下怎么搞成全局,因为电脑版微信收到的图片都看不了。。。头像也不出来
更新:
可以通过 proxifier 来指定哪个软件走代理
Google 查的注册码 P427L-9Y552-5433E-8DSR3-58Z68 软件还是有点小贵的...
慢慢更新
git rm --cached xxx.php
git merge --squash branch
git push origin :branchName
git diff --name-only commitId
git fetch 之后,遇到下面这种错误
error: cannot lock ref 'refs/remotes/origin/xxxxx': 'refs/remotes/origin/xxx' exists; cannot create 'refs/remotes/origin/xxxxx'
执行 git remote prune origin
git show --pretty="" c9a60ef4bc1c4337293a4ea95bb8dd9407a3e306 --name-only
git log --since=2019-01-01 --until=2019-06-30 --author="jiayx" --pretty=format:"%h - %an, %ad : %s"
git log --author="jiayx" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -
准备数据
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`score` int(11) DEFAULT NULL,
`type` varchar(255) DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
INSERT INTO `score`
(`name`, `type`, `score`)
VALUES
('张三','语文',89),
('张三','数学',100),
('张三','英语',93),
('李四','语文',90),
('李四','数学',94),
('李四','英语',83);
score 表:
name | score | type |
---|---|---|
张三 | 89 | 语文 |
张三 | 100 | 数学 |
张三 | 93 | 英语 |
李四 | 90 | 语文 |
李四 | 94 | 数学 |
李四 | 83 | 英语 |
想要的效果:
姓名 | 语文 | 数学 | 英语 | 总分 |
---|---|---|---|---|
张三 | 89.00 | 100.00 | 93.00 | 282 |
李四 | 90.00 | 94.00 | 83.00 | 267 |
平均分 | 89.50 | 97.00 | 88.00 | - |
采用 IF 语法查询
SELECT name AS '姓名',
SUM(IF(type='语文', score, 0)) AS '语文',
SUM(IF(type='数学', score, 0)) AS '数学',
SUM(IF(type='英语', score, 0)) AS '英语',
SUM(score) AS '总分'
FROM score
GROUP BY name
UNION ALL
SELECT '平均分',
ROUND(AVG(IF(type = '语文', score, NULL)), 2) AS '语文',
ROUND(AVG(IF(type = '数学', score, NULL)), 2) AS '数学',
ROUND(AVG(IF(type = '英语', score, NULL)), 2) AS '英语',
'-' AS '总分'
FROM score
使用 CASE 语法查询
SELECT name AS '姓名',
MAX(CASE type WHEN '语文' THEN score ELSE 0 END) AS '语文',
MAX(CASE type WHEN '数学' THEN score ELSE 0 END) AS '数学',
MAX(CASE type WHEN '英语' THEN score ELSE 0 END) AS '英语',
SUM(score) AS "总分"
FROM score
GROUP BY `name`
UNION ALL
SELECT '平均分',
ROUND(AVG(CASE type WHEN '语文' THEN score ELSE NULL END), 2) AS '语文',
ROUND(AVG(CASE type WHEN '数学' THEN score ELSE NULL END), 2) AS '数学',
ROUND(AVG(CASE type WHEN '英语' THEN score ELSE NULL END), 2) AS '英语',
'-' AS '总分'
FROM score
函数AVG()
忽略NULL
值,而不是将其作为 0 参与计算,也就是说 取平均值的时候 NULL 不参与计数