今天网上随便看东西的时候,看到一个名为【任何技能都是从模仿开始,逐步升华。】的博客。地址

以前想写一个 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 软件还是有点小贵的...

慢慢更新

  • 去掉对 xxx.php 文件的跟踪
    git rm --cached xxx.php
  • merge 的时候合并多次 commit 为一个
    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

  • 查看某次 commit 修改的文件
    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 表:

namescoretype
张三89语文
张三100数学
张三93英语
李四90语文
李四94数学
李四83英语

想要的效果:

姓名语文数学英语总分
张三89.00100.0093.00282
李四90.0094.0083.00267
平均分89.5097.0088.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 不参与计数

  1. 自我介绍
  2. 规划是什么
  3. 做过的比较有意义的项目
  4. 对公司的贡献
  5. 分库分表的问题 垂直分水平分
  6. require include 区别
  7. php 加快响应速度的办法
  8. 一个亿级访问量网站的架构
  9. session 共享的问题
  10. 公司服务器架构
  11. 前端相关东西