分类 其他 下的文章

ss 是 shadowsocks 的简称。

这里以 Ubuntu 16.04 为例

  1. 买好墙外的服务器
  2. 使用 root 用户登录到服务器(如使用非 root 用户,下面的所有命令前加 sudo)
  3. apt update && apt upgrade && apt autoremove
  4. apt install python-pip
  5. pip install --upgrade pip
  6. pip install setuptools
  7. pip install git+https://github.com/shadowsocks/shadowsocks.git@master
  8. vi /etc/shadowsocks.json 写入配置文件 格式如下:

    {
     "server": "这台服务器的 IP",
     "server_port": 8388,
     "local_address": "127.0.0.1",
     "local_port": 1080,
     "port_password": {
         "1234": "12345678"
     },
     "timeout":300,
     "method":"aes-256-cfb",
     "fast_open": false
    }

    其中 port_password 字段可以添加多条。前面的数字代表对外提供服务的端口,后面的字符串代表使用前面的端口登录到 ss 的密码。

  9. ssserver -c /etc/shadowsocks.json

可以在 .bashrc 中加几个别名,后续操作方便一些
alias ssstart='ssserver -c /etc/shadowsocks.json -d start'
alias ssstop='ssserver -c /etc/shadowsocks.json -d stop'
alias ssrestart='ssserver -c /etc/shadowsocks.json -d restart'

有时候想写点什么东西,但是打开编辑器之后,突然一个字都蹦不出来了。不爽啊!

过两天把这个博客迁移了吧,不用阿里云了。换 Vultr。这个还是比较便宜的。
同等配置只需要阿里云一半不到的的价格,可以说是非常良心了。而且选择日本/新加坡机房访问速度快,还能 fq,很舒服。
只是这个主机商比较年轻,不知道稳定性如何,应该问题不大。跑了一个多月的 SS 也挺稳定,速度挺快。

今天入职新公司,但是发现网络访问并不自由。。公司内的 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 不参与计数