Authuir Notepad

Saving Memory

使用Visual Studio远程编译Nginx on Linux并远程Debug

为什么要使用VS开发

  和普通科班出身的人不同,我的 C++ 开发入门时候用的 IDE 应该就是Visual Studio 2012,而且自己写的一些小软件也基本上是在 windows 上跑跑而已,所以基本没有怎么用过 gdb 。等到了我接到 linux 开发需求的任务时已经为时已晚。虽然说此类 debugger 无非就是干三件事情:代码断点、变量监视、查看堆栈,但是用惯了VS系列 IDE 的我发现我已经不能接受gdb这种命令行下的 debugger 软件了。

  万幸的是,在今年的 Microsoft Build 2017 Developer Conference 上,VS 开始原生支持远程编译、远程 debug ,这意味着我可以用 Linux 里的 gcc/g++ 去编译、用 gdb 去调试,再在最外面用 VS 这个“壳子”来让这个过程图形化,可以说是非常酷炫了。

这次的挑战

  这次我遇到的一个任务是给某公司的 Load Balance 服务器上的 nginx 开发一个定制插件。这个插件包括了以下功能:

  • 能通过 HTTP 请求的 Header 中的 UID 信息来区分不同的用户
  • 动态查询 UID 对应的不同用户的限速值并给予限速(上行、下行)
  • 实现一定的负载均衡功能

  仅仅就限速这个功能来说,还是非常好实现的,现成的插件也是一大堆,再不济用 openresty 也是没问题的,但是动态限速和 UID 获取就得再对现成的限速代码做一定修改了。

  由于 nginx 的插件需要连同 nginx 一块编译,所以在 linux 平台上调试起来对于我这个 gdb 小苦手也是非常难受的,所以这一次我决定用一下 VS2017 提供的远程 Debug 新功能。

相关介绍

  对于这个新功能的详细介绍请参看这里,讲解得非常清晰,我就说说自己的一些理解吧。

  这个 Remote Debugger 的底层实质还是 gdb-server ,所以它的写代码到编译到调试的过程实质上是这样的:

  • 首先在 VS 的 IDE 中修改了代码之后,代码会保存到硬盘,在按下 Remote Debugger 按钮之后,VS 会通过你预先输入的 SSH 帐号密码使用 SCP 传输到远程 Linux 机器上。
  • 然后 VS 将通过 SSH 远程使用 GCC 编译源代码,若出现错误,则将错误传输到 Windows 的 VS 界面上,如果没有错误,将生成二进制可执行文件。
  • VS 再通过 gdb-server 打开一个端口供远程主机访问,然后 VS 接入端口,即可使用 gdb 对远程机器上跑的程序进行调试,VS 再把这个过程在界面中可视化,这样就做到了在 VS 中写、调试跑在 Linux 上的代码。

阅读

啥是I/Q Data

  这篇文章主要介绍如何用 I/Q 数据来表示一个信号。非本专业的童鞋或者刚念大二大三的童鞋看了可能会非常疑惑,所以这篇文章我将用不同的角度来描述它。如果你觉得看不懂,那么继续往下看,后面可能会更容易理解——希望如此。

为什么要使用 I/Q 数据

  如果让你用一串数据来表示一个信号,你会如何表示?最直观的方式是使用一串信号振幅的采样序列,如下图:

cosample.png

  那为什么要多此一举使用 I/Q 数据来表示呢,采样序列的方式不够好吗?

  事实上确实不够好,有下面一些问题:

  • 首先,这样表示无法确定信号的频率。当然这样表示看起来非常简单,也非常直观,你可能会说,这样表示可以通过看信号的周期的方式来确定频率。当然这样做没错,但是问题在于,即使某个信号是从同一条曲线采样出来的花,你也无法确定这是一个正频率还是一个负频率,例如 : cos(x) = cos(-x) 。在你对信号处理的时候,这将成为一个麻烦。将两个信号相乘时,它将导致乘法的结果可能有好几个:f1 ⊗ f2 等于 f1 + f2 也等于 f1 - f2。
  • 其次,这样也很难确定信号的功率(峰值振幅,包络)。基本上你只能在 0°, 180°, 360° 的时候看到峰值振幅,而且你也不能确定后续的信号的功率是否也是一致。而且你也无法确定你就在峰值那一点上采到了样,真的很难确定。

  I/Q 数据解决了这些问题。它不是只在时间维度上对信号一维采样,而是把它在三维空间中看成一个螺丝(螺旋,螺旋弹簧)。

阅读

对于中间人攻击的一点想法

Ch.1 前文

  这篇文章的想法最初是我看了V站上的一篇帖子:怎么在无安全信道的情况下抵抗中间人攻击

现在的 ssl是因为有根证书担保,而根证书是预置在电脑里的。想问下,如果通讯双方没有预先协商任何内容且信道出入口完全被控制的情况下,还有没有办法抵抗中间人攻击。

  那么在讲讲我的想法之前,先来回顾一下现代的证书体系是如何运作的。

Ch.2 证书体系

  在说明这个体系如何运作之前,先来看看 Google 的证书长什么样:

1.png

  可以看到一个证书里面包含了很多信息,包括颁发者有效期加密方式等等信息,那证书是怎么来的呢?下面就来说一说现代证书体系有哪些角色以及他们各自的作用。

  • 公钥(Public Key):由服务器公布,可以和对应的的私钥互相解密对方加密的数据。
  • 私钥(Private Key):由服务器持有。
  • 数字证书(Digital Certification):CA颁发的,由申请方的个人信息、公钥等,经过CA的私钥加密而来的一串数据。
  • 证书授权中心(Certificate Authority):所有人公认的、具有公信力的、签发数字证书的部门。

  以上面为例,假如你现在要访问https://www.google.com/,Google的服务器会将它的数字证书先传递过来,浏览器将校验这个证书是否有效,若验证通过,浏览器将从数字证书中提取出公钥以并按照相应的加密算法将内容加密传输,至此完成(其实没有这么简单,有时候会双向校验,那些情况就更复杂了)。

  在以上的过程中,要展开中间人攻击,则有几个部分需要完成:

  1. 截取Google服务器发的数据包,并将数字证书替换为自己掌握了私钥的证书。
  2. 确保这个证书能骗过浏览器的校验。

  如果能做到上面两点,那么浏览器发送的数据将可被中间人用私钥解密,所有的数据都将暴露无遗。当然,做到第一步很简单,只需要改改数据包即可,要做到第二部就不是那么简单的事情了。为什么?因为有CA的存在。

  如上面所说,CA做的事情就是将申请方的公钥用CA的私钥加密,而CA的公钥可以解密这些信息,并且CA是默认被所有人信任的。如此一来,只要CA保证签发的数字证书是真实有效的,那么中间人将无法骗过浏览器。

  这中间还有最后一个问题,CA是如何默认被所有人信赖的呢?

  浏览器在被编写的过程中,会将几大CA厂商的证书写死在代码里,作为根证书,而根证书的颁发者就是根证书本身,其他所有的数字证书都可以追根溯源到根证书,这就是证书的互相信任关系,那么只要CA保持绝对的公信力,则所有证书将无法伪造。

  可以再打开刚刚那个证书的详情,可以很明显的看到这一点。

2.png

3.png

Ch.3 如果没有CA的存在会怎么样

  假如有这么一天,所有人将被一个邪恶的ZF统治,这个ZF强行控制了所有CA,那么事情将变得可怕起来,因为你将无法验证到底有没有人伪造CA的证书欺骗你。

  那么在这个情况下,在不事先和你朋友B商量好、且仅知道B的IP地址的情况下,如何做到完美加密你要发送给他的信息,又能让他解密出你的信息呢?

  其实这个问题和拜占庭将军问题有一点类似,拜占庭问题是这样的:

在战争的时候,拜占庭军队内所有将军和副官必需达成一致的共识,决定是否有赢的机会才去攻打敌人的阵营。但是,军队可能有叛徒和敌军间谍,左右将军们的决定,扰乱军队整体的秩序。在进行共识时,结果并不代表大多数人的意见。这时候,在已知有成员谋反的情况下,其余忠诚的将军在不受叛徒的影响下如何达成一致的协议,拜占庭问题就此形成。

  数学上已经证明拜占庭将军问题在忠臣和奸臣的数量满足一定关系时可以解决,但是对于我们这个问题呢?

  很遗憾,我认为是无解的。因为你不管发送了什么信息,只要有人能截获你的中间流量,那么这个人就完全可以伪造成B和你通信,再伪装成A与B通信,在没有事先和B商量好的情况下(即通过某种方式确认这份加密的数据确实是由B加密的),A是无论如何也不可能判定出有没有人伪造B与你通信的。

对一道算法题的思考

Ch.1 前记

  某日邹欣老师在群里出了一道题目。

1.png

  题目如下:一个文本文件中有N 个不同的英语单词, 我们能否写一个程序,快速找出最长的能首尾相连的英语单词链,每个单词最多只能用一次。

  例如, 文件里有:

Apple
Zoo
Elephant
Under
Fox
Dog
Leaf
Tree

  最长的相连英语单词串为: apple - elephant – tree, 输出到文件里面,是这样的:

Apple
Elephant
Tree

  要求程序 (WordList.exe)能处理命令行参数,知道什么是输入文件, 输出文件应该放在哪里。 这样,当助教拿到学生的源程序后,就能编译,并运行一系列的测试。

shell> Wordlist.exe  /i input1.txt   /o  output1.txt
shell> Wordlist.exe  /i input2.txt   /o  output2.txt

阅读

服务器炸了重配

Ch.1 前言

  服务器炸了,重新配。

Ch.2 服务器配置信息

  • 配置Nginx+PHP+MySQL。
  • 配置防火墙。
  • 配置BBR。
  • 配置ShadowsocksR。
  • 配置MySQL双主互备份。
  • 配置RSync异地同步。
  • 配置监控。

Ch.3 装软件

  服务器软件在版本选择上将全部使用最新稳定版(Nginx 1.12,PHP 7.1.6,MySQL 5.7)。

阅读