time 命令用于统计给定命令所花费的时间。
语法
1 | time [-f 参数] 命令 |
当测试一个程序或比较不同算法时,执行时间是非常重要的,一个好的算法应该是用时最短的。所有类UNIX系统都包含time命令,使用这个命令可以统计时间消耗。例如:
1 | time ls |
time 命令用于统计给定命令所花费的时间。
语法
1 | time [-f 参数] 命令 |
当测试一个程序或比较不同算法时,执行时间是非常重要的,一个好的算法应该是用时最短的。所有类UNIX系统都包含time命令,使用这个命令可以统计时间消耗。例如:
1 | $ time ls |
最近在看机器学习方面内容,所以需要写一些代码来跑机器学习中一些简单的算法。很多算法都用到numpy这个库。但是对立面axis
轴这个名词一直不懂。本篇文章就是来解释这个名词是什么意思。
要想理解这个名词,我们先看一些例子,看懂例子之后,这个名词就比较好理解。
我在使用hexo构建自己的博客时遇到过这样的一种情况。使用hexo init
命令创建一个静态网页目录,然后使用git来管理这个目录。如果这时需要替换themes,一般都是克隆主题对应的的仓库到themes目录下面,这时就会出现一个仓库里面包含另外一个子仓库,在git里面,称这为子模块。但是我们改了主题的配置文件,去提交,会返现主题对应的目录是空的。
首先有一种最简单的方法,就是讲子模块下面的.git
目录给删除,那么这个仓库就是一个普通的目录,但是这个对以后升级不方便。
下面我们通过实例来讲解如何优雅的解决这个问题。
我创建的目录结构如下
在nginx中,负载均衡策略主要由以下几种,轮询、加权轮询、ip_hash、least_conn、fair和url_hash。下面将分别介绍每一种。
ngx_http_upstream_module
模块用于定义服务器组,可以在proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass
以及memcached_pass
指令中引用。
示例如下:
1 | upstream backend { |
ngx_http_rewrite_module模块用于使用pcre正则表达式更改请求URI、返回重定向和有条件地选择配置。此模块主要有下面几个指令:break
,if
,return
,rewrite
和set
指令,这些指令按照以下顺序被执行:
下面分别看看上面的每个指令:
停止执行 ngx_http_rewrite_module 的指令集,但是其他模块指令是不受影响的。
1 | Syntax: break; |
例子:
1 | server { |
发送请求和得到的结果如下:
1 | curl 127.0.0.1:8080/testbreak |
可以看到 返回 /other
而不是 /testbreak
,说明 proxy_pass
指令还是被执行了,也就是说 其他模块的指令是不会被 break 中断执行的(proxy_pass是ngx_http_proxy_module的指令)
依据指定的条件决定是否执行 if 块语句中的内容。里面可以设置其他模块的指令,但是必须是if指令所在上下文中存在的指令。
1 | Syntax: if (condition) { ... } |
变量名
,如果变量 $variable 的值为空字符串或者字符串”0”,则为false变量
与一个字符串的比较相等为(=) 不相等为(!=) 变量
与一个正则表达式的模式匹配 操作符可以是(~
区分大小写的正则匹配, ~*
不区分大小写的正则匹配, !~``!~*
,前面两者的非)-f
(存在) 和 !-f
(不存在)-d
(存在) 和 !-d
(不存在) 后面判断可以是字符串也可是变量-e
(存在) 和 !-e
(不存在) 后面判断可以是字符串也可是变量-x
(可执行) 和 !-x
(不可执行) 后面判断可以是字符串也可是变量注意 上面 第1,2,3条被判断的必须是变量, 4, 5, 6, 7则可以是变量也可是字符串
1 | set $variable "0"; |
停止处理并将指定的code码返回给客户端。在不发送响应头的情况下关闭连接则设置code码为444(这个是nginx特有的,不一定适用于其他的服务器)。
从0.8.42版开始,可以指定重定向URL(code码为301、302、303、307和308)或响应正文文本(不是前面的重定向或者444code码)。响应正文文本和重定向URL可以包含变量。在特殊情况下,可以将重定向URL指定为此服务器的本地URI,在这种情况下,重定向的完整URL是根据请求方案($scheme)和重定向指令中的server_name_in_redirect和port_in_redirect来形成。
此外,可以只设置URl参数,不过这样的指令返回的code码都是302.可以将代码为302。这样的参数以“http://”、“https://”或“$scheme”字符串开头。URL可以包含变量。
在版本0.7.51之前可以使用以下code码:204、400、402-406、408、410、411、413、416和500-504。
直到版本1.1.16和1.0.13,code码307才被视为重定向。
直到版本1.13.0,code码308才被视为重定向。
1 | Syntax: return code [text]; |
例子如下:
1 | # return code [text]; 返回 ok 给客户端 |
1 | Syntax: rewrite regex replacement [flag]; |
如果指定的正则表达式与请求URI匹配,URI将会替换成replacement字符串。rewrite指令按照它们在配置文件中出现的顺序依次执行。可以使用flag
终止指令的进一步处理。如果替换字符串以“http://”、 “https://” 或“$scheme”开头,则停止处理并将重定向返回到客户端。
这里先看俩个例子,然后在来说rewrite的四个flag
第一种情况 重写的字符串 带http://
1 | location / { |
在浏览器中输入
1 | 127.0.0.1:8080/test1/baidu |
则临时重定向到 www.baidu.com,后面的 return 指令将没有机会执行.
第二种情况 重写的字符串 不带http://
1 | location / { |
发送请求和结果如下
1 | curl 127.0.0.1:8080/test1/baidu |
此处没有带http:// 所以只是简单的重写。请求的 uri 由 /test1/baidu 重写为 www.baidu.com。因为会顺序执行 rewrite指令所以下一步执行return指令响应了ok
last
ngx_http_rewrite_module
的指令集,并开始搜索与更改后的URI
相匹配的location
;break
ngx_http_rewrite_module
指令集,就像上面说的break
指令一样;redirect
permanent
1 | # 没有rewrite 后面没有任何 flag 时就顺序执行 |
发送请求和结果如下:
1 | curl 127.0.0.1:8080/test1 |
从上面可以看出,在第一个location中,将地址重写成/test3,也就是符合我们说的,如果没有flag时,就顺序执行,然后执行到最后一个时,就去搜索location,返回对应的结果。
last和break一样它们都会终止此location中其他它rewrite模块指令的执行,但是last立即发起新一轮的location 匹配,而break不会。
例子如下:
1 | location / { |
发送请求和结果如下:
1 | curl 127.0.0.1:8080/test1 |
这个结果符合我们的预期,发送了一个新的请求。
当如果将上面的location /
改成如下代码
1 | location / { |
浏览器输入127.0.0.1:8080/test1
,代理到百度产品大全页面https://www.baidu.com/more/index.html
;也就是请求地址重写。但是不会重新发送新一轮的请求。类如上面如果美欧proxy_pass指令,使用同样的请求将返回404。
但是,如果这些指令放在location为/download/
下,最后一个标志应该替换为break,否则nginx将进行10次循环并返回500个错误:
1 | location /download/ { |
如果替换字符串replacement
包含新的请求参数,则在它们之后附加先前的请求参数。如果你不想要之前的参数,则在替换字符串 replacement
的末尾放置一个问号,避免附加它们。
1 | # 由于最后加了个 ?,原来的请求参数将不会被追加到rewrite之后的url后面 |
1 | Syntax: rewrite_log on | off; |
开启或者关闭 rewrite
模块指令执行的日志,如果开启,则重写将记录下notice
等级的日志到nginx
的 error_log
中,默认为关闭 off
1 | Syntax: set $variable value; |
设置指定变量的值。变量的值可以包含文本,变量或者是它们的组合形式。
1 | location / { |
1 | Syntax: uninitialized_variable_warn on | off; |
控制是否记录有关未初始化变量的警告。默认开启
先说一下,你们可能看到我的面经也会觉得很惊奇,为什么其他面经里面出现的问题,我这里几乎都没出现,而且面试流程也走的这么快。下面就看一下我的阿里春招面试奇葩之旅。
自己在回答问题的时候想到哪就说道哪,没有一个具体明确的思路,所以面试完需要自己整理自己学过的知识点,然后形成一个体系。
这一面总体不是很好,首先自己是跑到一个安静的地点接的电话,当时气喘吁吁。因此自己在面试的时候最好处于一个很好的状态,不要像我这样。然后就面试,因为没怎么准备自我介绍,所以比较蒙。另外这一面就是总结面,没什么技术问题,主要是聊聊你的学习情况,所以最好多看看面经,准备这些比较长问到的问题。
下面记录的是我面腾讯TEG事业群的经历
自我介绍:我主要的是介绍我的项目,因为是很突然的接到电话,当时也没准备自我介绍,就直接将简历上面的项目介绍了一遍。但是自我的感觉介绍不是太好,因为我自己都觉得讲的不是很清楚。所以如果你要参加面试前,最好先写一个简单的自我介绍,如果是项目介绍,最好先介绍下背景,然后在介绍整个项目。这样面试官相对好理解写。不过最好不要把项目介绍的太仔细,要留下一些点让面试官自己来提问。这个度需要自己把握,。
tcp三次握手:就是简单的问了一下这个问题,面试官没有问为什么需要三次握手。可能是我在回答这个问题的时候讲了自己遇到的一个”connection by peer reset“异常,然后描述了一下自己是怎么解决这个问题的。
java 垃圾回:这个几乎只要是面java的都会问,所以需要好好整理
java中的锁:这个主要问的是Synchronize和lock的区别,以及怎么的选择。
限流:我主要说了一个根据访问的量来进行限流,后面面试官说可以通过信号量来限流。
raft:这个主要是考分布式相关的问题,然后我说只记得一点,把自己记得的讲了出来。
mapreduce:这个也是在问分布式相关的问题,但是还是忘记了,然后把自己记得的讲了出来。
后面就是面试官问我还有什么想问他的,问了一下具体部门,他们是做中间件和大数据相关的组。
面试官主要对我的一个项目比较感兴趣,主要也在问我这个项目。不过其中有一些点没有讲的很好,比如我在项目中用到了负载均衡,但是我没有仔细的看过负载均衡实现的方法,就简单的回答了一下。所以你写在简历上的项目一点要仔细的整理。
以前自己看过很多的论文,但是都没有仔细整理,这次面试也凸显出来,所以自己看过的知识点一定要好好整理。知道不代表懂。
尽量不要紧张,因为这是我第一次面大公司所以比较紧张。不过这个也没有什么好办法,尽量多面点就不会紧张。
和面试管尽量不要保持他问你答的状态,最好是处于一种聊天的状态。这次面试前面就是因为他问我搭所以比较紧张,在面试一会之后就转入了一种在聊天的状态,紧张感也就没有了。
项目介绍:和上面一样
自定义协议:如和自定义协议,也是项目中的一个问题,我当时回答的是:协议定义是非常难的一个问题,要考虑很多的方面,比如完整性和尽量减少跟数据无关的协议头的长度。然后我只是简单的将自己在项目中使用了自定义协议,主要是因为我发现在这个项目里面数据传输几乎都是一样的,所以就自定义了一个协议,但是这个自定义的协议非常的粗糙。如果不是比赛的话,我不会这样做,因为要提升性能才这样做的。但是在真正的生产环境中要考虑适配和兼容性这些问题,最好还是使用通用性协议
线程,线程是如何调度,Java线程是如何调度
你觉得你项目有什么难点
快速排序:这个问题当时没回答好,因为我吧快排和希尔排序弄混,所以就和面试官分别介绍了这俩个排序,然后总结了一下为什么快排相对来说比较好。主要胜在平均性能。
其实问题不是太难,但是自己在回答的过程中思路不是太清晰,所以自我感觉回答的不是太好。另外一些基础的问题没有弄好。所以下来需要整理。
这个面试完了之后,也是在周五下午,进行了最后一轮的HR面试。至此我的腾讯实习面试之路走完。另外我的二面其实在前一周也可以结束,但是因为自己手机调整成了静音,没有接到电话,所以空等了一周,拖到了这周面试。所以在面试过程中手机千万不要调成静音。