2018年4月

一、luaL_dofile(): cannot open ./lib.lua: No such file or directory

问题原因

运行应用的目录和lua文件不在同一个目录,.lua文件所在的目录是当前所在的目录而不是程序所在目录。

ma@ubuntu:/data/code/lua/2-lua和c++/cpp-lua$ tree
.
├── debug
│   └── app
├── lib.lua
├── main.cpp
└── Makefile

1 directory, 6 files

app在当前目录下的debug目录下,在当前目录下执行./debug/app可以成功读取到lib.lua,但是在debug目录下执行./app就会报错。

- 阅读剩余部分 -

准备玩一下docker,但是发现对内核要求比极高,习惯了CentOS6系不想换成7,所以最后只能把内核升级了。

CentOS 6.5默认内核版本:

步骤其实很简单,照着网上的教程升级,两步就搞定了。

1. 安装ELRepo

Repo是什么没有研究过,只是根据网上的教程一顿操作。

目测应该是内核的仓库地址,这个可在http://elrepo.org/tiki/tiki-index.php找到。

rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install kernel-ml -y

- 阅读剩余部分 -

前几天面试时候遇到的问题:

给定一个十六进制字符串"AB",转换成十六进制的整数0xab输出。

临时接到的面试通知,赶场子过去一坐下就给个题目,说实话面试了一两个星期是第一次做这方面的面试题。没有思想准备,当时脑海里就闪过两个念头,一个是左移,一个是直接进制转换。

- 阅读剩余部分 -

一、父子进程共享内容

相同处

全局变量,.data, .text、堆栈,环境变量,用户id工作目录。

重点:文件描述符,mmap建立的映射区。

不同处

进程ID、fork返回值、各自父进程、进程运行时间、定时器,未决信号集。

子进程复制了父进程的用户空间,遵循读时共享,写时复制原则。

- 阅读剩余部分 -

reserve方法用来给vector预留空间,预留的空间只会改变capacity的大小,不会改变size大小。resize方法表示重新调整数组大小,capacity和size都会改变。

使用reserve后,不能直接使用下标来增加元素,虽然内存是已经分配了直接使用不会报错,但是直接通过下标来复制会导致其他参数得不到更新(如size),会导致意想不到的错误。如以下代码:

int i;
vector<int> v;
v.reserve(10);
cout << "cap: " << v.capacity() << ", size: " << v.size() << endl;
for (i = 0; i < 10; i++) {
    v[i] = i;
}
cout << "cap: " << v.capacity() << ", size: " << v.size() << endl;

输出:

cap: 10, size: 0
cap: 10, size: 0

通过下标给数组中的每个元素复制,实际上本身数组的长度并没有得到增长,一旦再执行push_back就会导致前面的数据被覆盖。正确的方式是使用push_back或者insert方法插入元素。

使用Github Pages部署静态网页

一、关于Github Pages

github pages是github提供的静态文件托管服务,支持部署仓库内的静态页面文件,特别适合hexojekyll以及gitbook等应用部署网站使用。Github Pages有以下几个优点:

  1. 完全免费
  2. 支持自定义域名
  3. 支持HTTPS
  4. 免备案

其实国内像gitee.comcoding.net也都是提供Pages服务的,但是经过几年的使用感受来说,这两家相对于github还略有不足。主要体现在:

  1. coding在几年前是免费的,也支持自定义域名和HTTPS,无需备案,当时甚至支持对php动态程序的托管。如果coding一直是这种情况,我肯定毫无疑问选择coding,但是coding在17年底18年初和腾讯合作之后,功能就被阉割了。几个功能不是开会员才能使用,就是服务器得收钱。特别是在推广的Web IDE用起来完全没有之前清爽,感觉很笨重。因此后面在改版之后基本就没用过了(当时是在coding部署的hexo博客,改版后导致我后面直接连hexo都没用了T_T)。
  2. gitee也是近两年才大力改善Pages的功能,以前是不支持自定义域名的,部署之后得用用户名.gitee.com/仓库名/来访问,HTTPS功能更是没有(因为太挫了所以gitee基本不用)。现在是支持了自定义域名,但是要开通会员才能自定义域名,每年99(直接放弃)。

对比来看,github还算比较良心的,这也是为什么会选择github来托管的原因。但是github pages也有功能是不足的地方:

  1. 不支持分支部署,只支持部署master分支或者master分支下的docs目录。而上面两家国内托管机构支持多分支部署。
  2. 不支持目录部署,例如希望通过book.xxxx.com/a/和book.xxxx.com/b/分别部署两个仓库,在github pages中是不支持的。只能是通过多个自定义域名来区分,如a.book.xxxx.com和b.book.xxxx.com。

二、设置github pages

2.1 部署静态页面

pages的设置在setting页面中:

image50039403e34d74f1.png

点击后,一直往下拖就可以看到pages设置:

imagec8363663057f9ca9.png

pages目前只支持对master分支或者master的docs目录添加静态页面托管,要想托管页面,必须把文件放到master主目录或者docs目录下。而对于大多数应用(如gitbook)来说,主目录一般都是源码文件,因此建议把生成的静态文件放到docs目录下。当代码库中存在docs目录时,第二个选项会自动亮起。

imageaa67e5d9092374a8.png

点击后就可以使用username.gitee.io/projectname来访问静态页面了。

2.2 添加自定义域名

默认情况下,部署完成后,访问的URL为username.gitee.io/projectname,github支持自定义域名来重定向这个页面。

配置方法:Custom domain栏目中输入自定义的域名,点击Save即可。

我这里绑定的域名是html.book.maqian.io

image54a31ad6812de112.png

配置好后,页面会提示:

Your site is ready to be published at http://html.book.maqian.io/

现在要做的就是把域名添加指向到github pages的服务地址,有两种方法:

  1. 添加一条CNAME记录,指向username.github.io。可以参考Quick start: Setting up a custom domainCustom domain redirects for GitHub Pages sites
  2. 添加A记录,指向github服务器的IP地址,IP地址要在Troubleshooting custom domains找到。

正常情况下建议使用CNAME解析来指向github,因为域名都有套CDN,访问速度优于指向IP地址。

更多相关信息可参考Using a custom domain with GitHub Pages

添加CNAME解析

CNAME解析在DNS服务商处添加,因为打算把*.book.maqian.io都作为自定义域名,因此添加了以下CNAME解析:

imagea88cf94ba8d3a9b3.png

加好后,确认本机可以解析:

C:\Users\maqian>nslookup html.book.maqian.io
服务器:  public1.alidns.com
Address:  223.5.5.5

非权威应答:
名称:    maqianplus.github.io
Addresses:  185.199.111.153
          185.199.109.153
          185.199.108.153
          185.199.110.153
Aliases:  html.book.maqian.io

然后访问网站,部署的页面就出来了:

imagedab906d8bae5d8ef.png

2.3 强制https

github pages支持添加https,会自动申请Let's encrypt的证书,勾选上Enforce HTTPS选项就可以了:

imagedbb515b8a50c0195.png

选框无法被勾选的时候,先清空Custom domain里面的内容,点击Save,然后再勾选上Enforce HTTPS,填入自定义域名。

看到以下信息的时候,说明https证书已经在申请过程中了,耐心等待一段时间:

image8bdc5e1d6af76a8b.png

申请完成之后,勾选上选框:

image1b3d2accc9aa6543.png

再次访问就是https的了:

image409221fd63d000ce.png

TCP与UDP基本区别:

  • TCP提供的是面向连接,类似于打电话,会有握手流程。UDP无连接,类似广播。
  • TCP要求系统资源较多,UDP程序结构较简单,要求的系统资源也较少。
  • TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。UDP尽最大努力交付,即不保证可靠交付。
  • 流模式(TCP)与数据报模式(UDP),TCP面向字节流,UDP面向报文。
  • TCP保证数据正确性,UDP可能丢包。
  • TCP保证数据顺序,UDP不保证。
  • TCP连接只能是点到点的;UDP支持一对一、一对多、多对一和多对多的交互通信。

为什么UDP有时比TCP更有优势:

UDP以其简单、传输快的优势,在越来越多场景下取代了TCP,如实时游戏。

  1. 网速的提升给UDP的稳定性提供可靠网络保障,丢包率很低,如果使用应用层重传,能够确保传输的可靠性。
  2. TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程,由于TCP内置的系统协议栈中,极难对其进行改进。采用TCP,一旦发生丢包,TCP会将后续的包缓存起来,等前面的包重传并接收到后再继续发送,延时会越来越大,基于UDP对实时性要求较为严格的情况下,采用自定义重传机制,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成影响。

netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

- 阅读剩余部分 -